package com.json; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; public class JsonTest { // 解析json(最复杂的解析方法) public static void jieXIJSON() { String jsonStr = "{\"errorCode\":\"0\",\"errorMsg\" :\"调用接口成功\",\"data\":[{\"username\":\"张文哲\",\"position\":\"student\"}]}";//为了避免二义性,字符串里面的双印号使用了\转义字符 JSONObject root = new JSONObject().parseObject(jsonStr);// 将json格式的字符串转换成json String errorCode = root.getString("errorCode");//定义一个字符串,其值为根据json对象中的数据名解析出的其所对应的值 String errorMsg = root.getString("errorMsg"); System.out.println("errorCode=" + errorCode + ";errorMsg=" + errorMsg); JSONArray dataArr = root.getJSONArray("data");//根据json对象中数组的名字解析出其所对应的值 System.out.println(dataArr); //对解析出的数组进行遍历 for (int i = 0; i < dataArr.size(); i++) { JSONObject dataBean = (JSONObject) dataArr.get(i);//得到数组中对应下标对应的json对象 String username = dataBean.getString("username");//根据json对象中的数据名解析出相应数据 String position = dataBean.getString("position"); System.out.println(username);//打印输出 System.out.println(position); } } public static void main(String[] args) { jieXIJSON(); } }
其打印输出结果为:
errorCode=0;errorMsg=调用接口成功
[{"position":"student","username":"张文哲"}]
张文哲
student
以上这种解析json对象的方法较为麻烦,代码较多且复杂。可以利用java的反射机制通过把json对象解析成实体类对象的方式来解析json。
首先这里有两个实体类:
package com.json; import java.util.ArrayList; import java.util.List; public class RootEntity { private String errorCode; private String errorMsg; private List<UserEntity> data; public String getErrorCode() { return errorCode; } public void setErrorCode(String errorCode) { this.errorCode = errorCode; } public String getErrorMsg() { return errorMsg; } public void setErrorMsg(String errorMsg) { this.errorMsg = errorMsg; } public List<UserEntity> getData() { return data; } public void setData(List<UserEntity> data) { this.data = data; } }
package com.json; public class UserEntity { private String username; private String position; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPosition() { return position; } public void setPosition(String position) { this.position = position; } }
解析json字符串的代码:
package com.json; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; public class JsonTest { // 解析json(简单的解析方法,也就是通过json转实体类) public static void jsonToBean() { String jsonStr = "{\"errorCode\":\"0\",\"errorMsg\" :\"调用接口成功\",\"data\":[{\"username\":\"张文哲\",\"position\":\"student\"}]}"; RootEntity rootEntity = new JSONObject().parseObject(jsonStr,RootEntity.class);//将json字符串转换成json对象,并通过java的反射机制创建相应的实例 System.out.println(rootEntity.getErrorCode()); System.out.println(rootEntity.getErrorMsg()); System.out.println(rootEntity.getData()); } public static void main(String[] args) { jsonToBean(); } }
其运行结果如下:
0
调用接口成功
[com.json.UserEntity@3f78807]
但是使用这种方法解析json字符串时一定要注意:
所对应的类的属性名称和json数据格式中的数据属性名称一定要保持一致(原因:其使用了java反射机制)