Java 处理 JSON 数据小结

JSON的格式类型

JSON有三种格式类型:基本类型、数组类型、对象嵌套

基本类型

格式说明:{“键” : 值, “键” : “值”,…},以大括号开始,键的名称加上冒号,然后跟上对应的的值,若有其他键值对则以逗号进行分割。

{
    "student": "张三",
    "age": 18,
    "sex": true
}

数组类型

格式说明:[{“键” : 值, “键” : “值”},{“键” : 值, “键” : “值”},…],以中括号开始,其间的数据通过逗号进行分割。

[
    {
        "name": "张三",
        "age": 18,
        "sex": true
    },
    {
        "name": "李四",
        "age": 19,
        "sex": false
    }
]

对象嵌套

由上面两种类型,因为值的不固定性,可以演变出各种各样的嵌套类型。

{
    "name": "teacher",
    "computer": {
    "CPU":"intel7,
    "disk": "512G"
	},
	"students": [
        {
            "name": "张三",
            "age": 18,
            "sex": true
        },
        {
            "name": "李四",
            "age": 19,
            "sex": false
        }
    ]
}

JSON官网介绍可以参考。

1、使用 com.alibaba.fastjson 转换、解析json数据

POM引入依赖

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

使用不同对象处理不同类型的JSON数据。

java里面的json格式 java json格式_java

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class TestJson {
    public static void main(String[] args) {
        // json字符串-简单对象型
        final String JSON_OBJ_STR = "{\"studentName\":\"lily\",\"studentAge\":12}";
        // json字符串-数组类型
        final String JSON_ARRAY_STR = "[{\"studentName\":\"lily\",\"studentAge\":12},{\"studentName\":\"lucy\",\"studentAge\":15}]";

        JSONStrToJSONArray1(JSON_ARRAY_STR);
        JSONStrToJSONObject(JSON_OBJ_STR);
    }

    /**
     * 字符串(json数组类型格式)转换成JSONArray类型的json
     */
    public static void JSONStrToJSONArray1(String JSON_ARRAY_STR) {

        JSONArray jsonArray = JSON.parseArray(JSON_ARRAY_STR);
        // JSONArray jsonArray1 =JSONArray.parseArray(JSON_ARRAY_STR);//因为JSONArray继承了JSON,所以这样也是可以的
        
        // 遍历方式1
        int size = jsonArray.size();
        for (int i = 0; i < size; i++) {
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            System.out.println(jsonObject.getString("studentName") + ":" + jsonObject.getInteger("studentAge"));
        }

        // 遍历方式2
        for (Object obj : jsonArray) {
            JSONObject jsonObject = (JSONObject) obj;
            System.out.println(jsonObject.getString("studentName") + ":" + jsonObject.getInteger("studentAge"));
        }
    }
    

    /**
     * 字符串(json基本类型格式)转换成JSONObject类型的json
     */
    public static void JSONStrToJSONObject(String JSON_OBJ_STR) {

        JSONObject jsonObject = JSON.parseObject(JSON_OBJ_STR);
        //JSONObject jsonObject1 = JSONObject.parseObject(JSON_OBJ_STR); //因为JSONObject继承了JSON,所以这样也是可以的
		System.out.println(jsonObject.getString("studentName") + ":" + jsonObject.getInteger("studentAge"));
    }
}

若要将一个数组类型 格式的json字符串直接转换成一个list:
可以先根据json数组的key新建个 实体类:

public class Student {
    private String studentName;
    private String studentAge;
}

然后直接调用JSONArray.parseArray() 方法转换成对象list:

public class TestJson{
    final String JSON_ARRAY_STR = "[{\"studentName\":\"lily\",\"studentAge\":12},{\"studentName\":\"lucy\",\"studentAge\":15}]";
        
	public static void JSONStrToJSONArray1(String JSON_ARRAY_STR) {
        //直接转换成List
        List<IssueType> jsonList = JSONArray.parseArray(JSON_ARRAY_STR,Student.class);
        for (int i=0; i< jsonList.size(); i++){
            System.out.println(jsonList.get(i));
        }
    }
    public static void main(String[] args) {}
}


2、使用org.json.JSONArray / org.json.JSONObject 处理json

2.1 json字符串 转换为 JSONObject

import org.json.JSONException;
import org.json.JSONObject;
public class TestJsonObject {
	 public static void main(String[] args) throws JSONException {
	        //记得转义
	        String jsonStr="{\"studentName\":\"zhangsanfeng\",\"studentAge\":18,\"school\":\"大学\"}";
	        //利用构造函数直接转换成JSONObject类型对象
	        JSONObject jsonObj = new JSONObject(jsonStr);
	        int age = jsonObj.getInt("studentAge");
	        String studentName= (String) jsonObj.get("studentName");
	        String school = jsonObj.optString("school");
	        
	        System.out.println(studentAge);
	        System.out.println(studentName);
	        System.out.println(school);
	    }
	 //可以用JSONObject类型对象的put方法添加。
     private static void jSONObject(){
	       JSONObject jsonObject = new JSONObject();//new一个JSONObject对象,命名为jsonObject
	       Object nullObj = null; //解决put中因二义性引起的编译错误
	       try{
	           jsonObject.put("name","王小二");
	           jsonObject.put("age",25.2);
	           jsonObject.put("birthday","1990-01-01")
	           jsonObject.put("major",new String[] {"理发","挖掘机"});
	           jsonObject.put("has_girlfriend",false);
	           jsonObject.put("car",nullObj);
	           jsonObject.put("house",nullObj);
	           System.out.println(jsonObject.toString());//输出JSON格式的wangxiaoer数据
	       }catch(JSONException e){
	           e.printStackTrace();
	       }
   }
}

2.2 JSONObject 与 Map 互相转换

import org.json.JSONArray;
import org.json.JSONObject;
public class TestJson {
    public static void main(String[] args) {
        // json字符串-简单对象型
        final String JSON_OBJ_STR = "{\"studentName\":\"lily\",\"studentAge\":12}";
        // json字符串-数组类型
        final String JSON_ARRAY_STR = "[{\"studentName\":\"lily\",\"studentAge\":12},{\"studentName\":\"lucy\",\"studentAge\":15}]";
    }

	/**
     * JSONObject转换Map
     */
    public static Map convertJsonObjectToMap(JSONObject json){
        Map resultMap = new HashMap();
        //获取所有的key的迭代器
        Iterator<String> iterator = json.keys();
        while (iterator.hasNext()){
            String key = iterator.next();
            resultMap.put(key,json.opt(key));//调用的是map.get(key)
//            resultMap.put(key,json.get(key));//json.get(key)方法底层调用的还是opt(key)
        }
        return resultMap;
    }
	 /**
     * Map转换JSONObject
     */
    public static JSONObject convertMapToJsonObject (Map<String,Object> map){
        JSONObject jsonObject = new JSONObject();
        //获取所有key的集合
        Set<String> set = map.keySet();
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()){
            String key = iterator.next();
            jsonObject.put(key,map.get(key));
        }
        return jsonObject;
    }
	 /**
     * JsonArray转换MapList
     */
    public static List<Map> convertJsonArrayToMapList (JSONArray jsonArray){
        Map<String,Object> resultMap = new HashMap<>();
        List<Map> list = new ArrayList<>();
        for (int i=0; i<jsonArray.length(); i++){
            //获取每一个json中的每一个{}
            JSONObject json = jsonArray.optJSONObject(i);
            //将json的{}转化成map
            Map map = convertJsonObjectToMap(json);
            //将每一个map存入list中。
            list.add(map);
        }
        return list;
    }
    
}

3、实际场景json解析

场景1

json格式-基本类型:

{
    "student": "张三",
    "age": 18,
    "sex": true
}

解析方式:

JSONObject jsonObject=JSON.parseObject(result);      //转换成object
jsonObject.getString("returnAddress")    //获取object中returnAddress字段;

场景2

json格式-嵌套类型:

{
    "success":"true",
    "data":{
        "shop_uid":"123"
    }
}

解析方式:

JSONObject shop_user =JSON.parseObject(result);
JSON.parseObject(shop_user.getString("data")).getString("shop_uid")

场景3

json格式-对象嵌套带数组类型:

{
	"students": [
        {
            "student": "张三",
            "age": 18,
            "sex": true
        },
        {
            "student": "李四",
            "age": 19,
            "sex": false
        }
    ]
}

解析方式:

JSONObject json = new JSONObject(data);
	JSONArray rows = json.optJSONArray("students");
	for (int i = 0; i < rows.length(); i++) {
		JSONObject row = rows.optJSONObject(i);
		//打印出student字段值
		System.out.println(row.optString("student"));
	}

场景4

直接处理JSONArray格式数据:
处理成List<实体类型>的list。

解析方式:

List<ReasonDTO> ReasonDTOList = new ArrayList<>();
JSONArray array = (JSONArray) dadaApiResponse.getResult();
          array.stream().forEach(
                    i ->{
                        JSONObject object = JSONArray.parseObject(i.toString());
                        ReasonDTO cancelReasonDTO = new CancelReasonDTO();
                        ReasonDTO.setCancelCode((Integer) object.get("id"));
                        ReasonDTO.setCancelName((String) object.get("reason"));
                        ReasonDTOList.add(ReasonDTO);
                    }
            );