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反射機制)