
上面是一個标準的json的響應内容截圖,第一個紅圈”per_page”是一個json對象,我們可以根據”per_page”來找到對應值是3,而第二個紅圈“data”是一個JSON數組,而不是對象,不能直接去拿到裡面值,需要周遊數組。
下面,我們寫一個JSON解析的工具方法類,如果是像第一個紅圈的JSON對象,我們直接傳回對應的值,如果是需要解析類似data數組裡面的json對象的值,這裡我們構造方法預設解析數組第一個元素的内容。
在src/main/java下建立一個包:com.qa.util,然後在新包下建立一個TestUtil.java類。
packagecom.qa.util;importcom.alibaba.fastjson.JSONArray;importcom.alibaba.fastjson.JSONObject;public classTestUtil {
//1 json解析方法
public staticString getValueByJPath(JSONObject responseJson, String jpath) {
Object obj=responseJson;for(String s : jpath.split("/")) {if(!s.isEmpty()) {if(!(s.contains("[") || s.contains("]"))) {
obj=((JSONObject) obj).get(s);
}else if(s.contains("[") || s.contains("]")) {
obj= ((JSONArray)((JSONObject)obj).get(s.split("\\[")[0])).get(Integer.parseInt(s.split("\\[")[1].replaceAll("]", "")));
}
}
}returnobj.toString();
}
}
簡單解釋下上面的代碼,主要是查詢兩種json對象的的值,第一種最簡單的,這個json對象在整個json串的第一層,例如上面截圖中的per_page,這個per_page就是通過jpath這個參數傳入,傳回的結果就是3. 第二種jpath的查詢,例如我想查詢data下第一個使用者資訊裡面的first_name的值,這個時候jpath的寫法就是data[0]/first_name,查詢結果應該是Eve。
======================================================================================
======================================================================================
将接口請求傳回的 response 轉換成 json 格式
public JSONObject getResponseJson (CloseableHttpResponse response) throwsParseException, IOException {
Log.info("得到響應對象的String格式");
String responseString= EntityUtils.toString(response.getEntity(),"UTF-8");
JSONObject responseJson=JSON.parseObject(responseString);
Log.info("傳回響應内容的JSON格式");returnresponseJson;
}
//對象轉換成Json字元串
//Users user = new Users("Anthony","tester");
//String userJsonString = JSON.toJSONString(user);
======================================================================================
======================================================================================
Python 用 json 将 string 、dict 互相轉換
#!/usr/bin/env python#-*- coding: utf-8 -*-
importjson
string_json= "{"\"\"status\": \"error\","\"\"messages\": [\"Could not find resource or operation 'BZK1.MapServer' on the system.\"],"\"\"code\": 404"\"}"
print('對象:' +string_json)print(type(json.loads(string_json)))print('取值:' + json.loads(string_json)['status'])print('取值:' + str(json.loads(string_json)['code']))print('===========================================')
data1= {'b': 789, 'c': 456, 'a': 123}
encode_json=json.dumps(data1)print(type(encode_json))print(encode_json)print('===========================================')
decode_json=json.loads(encode_json)print(type(decode_json))print(decode_json['a'])print(decode_json)
運作的結果如下:
對象:{"status": "error","messages": ["Could not find resource or operation 'BZK1.MapServer' on the system."],"code": 404}取值:error
取值:404
===========================================
{"b": 789, "c": 456, "a": 123}===========================================
123{'b': 789, 'c': 456, 'a': 123}
======================================================================================
======================================================================================
public static voidmain(String[] args) {
//從字元串解析JSON對象
JSONObject obj = JSON.parseObject("{\"runoob\":\"菜鳥教程\"}");//從字元串解析JSON數組
JSONArray arr = JSON.parseArray("[\"菜鳥教程\",\"RUNOOB\"]\n");//将JSON對象轉化為字元串
String objStr =JSON.toJSONString(obj);//将JSON數組轉化為字元串
String arrStr =JSON.toJSONString(arr);
System.out.println("JSON.parseObject "+obj);
System.out.println("JSON.parseArray "+arr);
System.out.println("JSON.toJSONString "+objStr);
System.out.println("JSON.toJSONString "+arrStr);
}
輸出結果如下:
JSON.parseObject {"runoob":"菜鳥教程"}
JSON.parseArray ["菜鳥教程","RUNOOB"]
JSON.toJSONString {"runoob":"菜鳥教程"}
JSON.toJSONString ["菜鳥教程","RUNOOB"]
從 Java 變量到 JSON 格式的編碼過程如下:
public voidtestJson() {
JSONObject object= newJSONObject();//string
object.put("string","string");//int
object.put("int",2);//boolean
object.put("boolean",true);//array
List integers = Arrays.asList(1,2,3);
object.put("list",integers);//null
object.put("null",null);
System.out.println(object);
}
在上例中,首先建立一個 JSON 對象,然後依次添加字元串、整數、布爾值以及數組,最後将其列印為字元串。
輸出結果如下:
{"boolean":true,"string":"string","list":[1,2,3],"int":2}