一文让你熟练使用 JSONObject 和 JSONArray

依赖

导入阿里的 fastjson 依赖。

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.78</version>
        </dependency>

类型转换

String 与 JSON 相互转换

通过 JSONObject.parseObject(String str) 将字符串转换为 JSONObject 对象,此方法支持 JSON 字符串,JSON 字符串格式如下:

写法一:

{
    
    
	"code":"1",
	"status":"success",
	"target":"年入百万",
	"msg":{
    
    
		"seq":"20230424",
		"weather":"晴",
		"salary":9000.00,
		"job":"摆地摊"
	},
	"goods":{
    
    
		"sum":2000.00,
		"manufacturer":{
    
    
			"address":"青口",
			"boss":"张三"
		},
		"details":[
			{
    
    
				"name":"土豆",
				"weight":"500斤"
			},
			{
    
    
				"name":"豆腐",
				"weight":"250斤"
			}
		]
	}
}

写法二:

{
    
    "code":"1","status":"success","target":"年入百万","msg":{
    
    "seq":"20230424","weather":"晴","salary":9000.00,"job":"摆地摊"},"goods":{
    
    "sum":2000.00,"manufacturer":{
    
    "address":"青口","boss":"张三"},"details":[{
    
    "name":"土豆","weight":"500斤"},{
    
    "name":"豆腐","weight":"250斤"}]}}

转换案例代码:

        String JSONstr1 = "{\n" +
                "\t\"code\":\"1\",\n" +
                "\t\"status\":\"success\",\n" +
                "\t\"target\":\"年入百万\",\n" +
                "\t\"msg\":{\n" +
                "\t\t\"seq\":\"20230424\",\n" +
                "\t\t\"weather\":\"晴\",\n" +
                "\t\t\"salary\":9000.00,\n" +
                "\t\t\"job\":\"摆地摊\"\n" +
                "\t},\n" +
                "\t\"goods\":{\n" +
                "\t\t\"sum\":2000.00,\n" +
                "\t\t\"manufacturer\":{\n" +
                "\t\t\t\"address\":\"青口\",\n" +
                "\t\t\t\"boss\":\"张三\"\n" +
                "\t\t},\n" +
                "\t\t\"details\":[\n" +
                "\t\t\t{\n" +
                "\t\t\t\t\"name\":\"土豆\",\n" +
                "\t\t\t\t\"weight\":\"500斤\"\n" +
                "\t\t\t},\n" +
                "\t\t\t{\n" +
                "\t\t\t\t\"name\":\"豆腐\",\n" +
                "\t\t\t\t\"weight\":\"250斤\"\n" +
                "\t\t\t}\n" +
                "\t\t]\n" +
                "\t}\n" +
                "}";
        String JSONstr2 = "{\"code\":\"1\",\"status\":\"success\",\"target\":\"年入百万\",\"msg\":{\"seq\":\"20230424\",\"weather\":\"晴\",\"salary\":9000.00,\"job\":\"摆地摊\"},\"goods\":{\"sum\":2000.00,\"manufacturer\":{\"address\":\"青口\",\"boss\":\"张三\"},\"details\":[{\"name\":\"土豆\",\"weight\":\"500斤\"},{\"name\":\"豆腐\",\"weight\":\"250斤\"}]}}";
        JSONObject jsonObject1 = JSONObject.parseObject(JSONstr1);
        JSONObject jsonObject2 = JSONObject.parseObject(JSONstr2);
        System.out.println(jsonObject1);
        System.out.println(jsonObject2);

输出:


如果是 JSONArray 类型的字符串,如下:

		"details":[
			{
    
    
				"name":"土豆",
				"weight":"500斤"
			},
			{
    
    
				"name":"豆腐",
				"weight":"250斤"
			}
		]

则需要用 JSONArray.parseArray()


将 JSON 转换为 String,使用 toJSONString() ,如下:

        JSONObject jsonObject = new JSONObject();
        jsonObject.toJSONString();
        JSONObject.toJSONString(jsonObject);

		JSONArray JSONArray = new JSONArray();
        JSONArray.toJSONString();
        JSONArray.toJSONString(JSONArray);

JSON 与 实体类

@Slf4j
public class Test2 {
    
    
    public static void main(String[] args) {
    
    
        String roleStr = "{\"name\":\"张三\",\"age\":7}";
        Role role = JSONObject.parseObject(roleStr, Role.class);
        log.info(role.toString());
        log.info(role.getName());
    }
}

@Data
@NoArgsConstructor
@AllArgsConstructor
class Role {
    
    
    private String name;
    private Integer age;

}

JSON 与 Map

        Map<String, Object> map = new HashMap<>();
        map.put("name", "张三");
        map.put("age", 17);
        JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(map));

XML 与 Map 相互转换

https://blog.csdn.net/y1534414425/article/details/105770851

增删改查

获取数据

获取 JSONObject 数据:

根据 key 值获取对应的 value 数据。

        // 获取 target 的值,返回 String
        String target = jsonObject2.getString("target");
        // 获取 code 的值,返回 Object
        Object code = jsonObject2.get("code");
        // 获取 msg 的值,返回 JSONObject
        JSONObject msg = jsonObject2.getJSONObject("msg");
        // 获取 details 的值,返回 JSONArray
        JSONArray jsonArray = jsonObject2.getJSONObject("goods").getJSONArray("details");

注意:当要获取的数据不存在于 JSONObject ,获取到的对象为 null,单不会报 NullPointerException,如果继续对此 null 对象获取数据,会报 NullPointerException 。


获取 JSONArray 数据:

根据索引位置返回对象,索引下标从 0 开始。

        // 获取索引为 0 处的 JSON 对象,返回 Object
        Object o = jsonArray.get(0);
        // 获取索引为 0 处的 JSON 对象,返回 JSONObject
        JSONObject jsonObject = jsonArray.getJSONObject(0);

注意:如果要获取的数据不存在于 JSONArray 中,会报空指针。

移除数据

删除 JSONObject 中的数据:

        // 删除指定的 key ,返回被删除的数据 Object
        Object msg1 = jsonObject1.remove("msg");
        // 当 code 的值为 2 的时候才删除,删除成功返回 true,否则返回 false
        boolean code1 = jsonObject1.remove("code", "2");

注意:要移除的元素不在 JSONObject 中,并不会抛出异常。


删除 JSONArray 中的数据:可通过 jsonArray.size() 获取 JSONArray 中的 JSONObject 个数。

        // 移除索引为 0 的 JSONObject
        boolean remove1 = jsonArray.remove("0");
        // 移除指定的 JSONObject
        boolean remove = jsonArray.remove(jsonArray.getJSONObject(0));
        List<JSONObject> jsonObjects = new ArrayList<>();
        for (Object obj : jsonArray) {
    
    
            jsonObjects.add((JSONObject) obj);
        }
        // 移除所有 JSONObject
        boolean b = jsonArray.removeAll(jsonObjects);

注意:要移除的元素不在 JSONArray 中,并不会抛出异常。

移除并替换 JSONArray 中的所有数据:

		// detailArr 是 JSONArray
		Map<Integer, JSONObject> map = new HashMap<>();
        int size = detailArr.size();
        for (int i = 0; i < size; i++) {
    
    
            JSONObject item = detailArr.getJSONObject(0);
            map.put(i, item);
            detailArr.remove(0);
        }
        for (int i = 0; i < size; i++) {
    
    
            detailArr.add(map.get(i));
        }

新增数据

JSONObject 新增数据:

        JSONObject jsonObject = new JSONObject();
        // 插入 key-value ,如果已存在,则覆盖原来的 key 的 value,返回 Object
        Object tip = jsonObject.put("tip", "脱下长衫,摆摊致富");
        Map<String, Object> map = new HashMap<>();
        map.put("name", "大学生");
        map.put("major","通信工程");
        map.put("age", 22);
        // 插入 map
        jsonObject.putAll(map);
        // 插入 key-value ,如果 key 已存在,则插入失败且返回已有的 key-value
        Object tip1 = jsonObject.putIfAbsent("tip", "摆摊摆摊,日赚九千");
        // 将 map 作为 JSONObject 插入
        jsonObject.put("map", map);

JSONArray 新增数据:类似于 JSONObject,不过是 <索引 + Object>,而JSONObject 是 <key-value> 。

注意:JSONArray 给同一索引插入两次 JSONObject ,效果如下:

修改数据

        String str = "{\"code\":\"1\",\"status\":\"success\",\"target\":\"年入百万\",\"msg\":{\"seq\":\"20230424\",\"weather\":\"晴\",\"salary\":9000.00,\"job\":\"摆地摊\"},\"goods\":{\"sum\":2000.00,\"manufacturer\":{\"address\":\"青口\",\"boss\":\"张三\"},\"details\":[{\"name\":\"土豆\",\"weight\":\"500斤\"},{\"name\":\"豆腐\",\"weight\":\"250斤\"}]}}";
        JSONObject jsonObject = JSONObject.parseObject(str);
        // 替换对应 key 的 value
        jsonObject.replace("code", 1);
        JSONObject msg = jsonObject.getJSONObject("msg");
        msg.replace("salary", 10000.00);
        jsonObject.replace("msg", msg);

        // 替换对应 key 的 oldValue 为 newValue,如果 oldValue 不存在,则不替换
        jsonObject.replace("target", "年入十万", "年入千万");

注意:jsonObject 的 put(String key, Object value) 也能达到 replace 的效果。

猜你喜欢

转载自blog.csdn.net/m0_54355172/article/details/130336130