使用java進行網頁抓取時,有時會直接獲取到json串,json串要獲取的數據嵌套複雜,這裏自己寫一個遞歸的方式進行解析指定名稱的數據,進行記錄,以便日後複用。
原有json串:
{ "total": 3, "class": "二年級", "members": [{ "age": 18, "name": "張三", "course":[{ "Chinese":"123", "Maths":"121", "English":"110" }] }, { "age": 19, "name": "李四", "course":[{ "Chinese":"118", "Maths":"129", "English":"130" }] }, { "age": 18, "name": "王麻子", "course":[{ "Chinese":"133", "Maths":"111", "English":"134" }] }] }
java遞歸解析方法:
import org.json.JSONObject; import org.json.JSONArray; /** * * @param returnObject 返回的數據List * @param object 傳入的json串 * @param keys 需要解析的節點數組,按順序組成數組 * @param index index==keys.length爲基線條件,index起始爲0 */ private static void getData(List<Object> returnObject,Object object,String[] keys,int index){ if (index==keys.length){ returnObject.add(object); return; } if (object instanceof JSONObject){ if (!((JSONObject) object).has(keys[index])){ return ; } Object object1=((JSONObject) object).get(keys[index]); getData(returnObject,object1,keys,index+1); } else if (object instanceof JSONArray){ JSONArray jsonArray=(JSONArray) object; for (Object jsonObject:jsonArray){ getData(returnObject,jsonObject,keys,index); } } }
遞歸調用方法:
public static void main(String[] args) { String jsonStr="{\n" + "\t\"total\": 3,\n" + "\t\"class\": \"二年級\",\n" + "\t\"members\": [{\n" + "\t\t\"age\": 18,\n" + "\t\t\"name\": \"張三\",\n" + "\t\t\"course\":[{\n" + "\t\t\t\"Chinese\":\"123\",\n" + "\t\t \t\"Maths\":\"121\",\n" + "\t\t \t\"English\":\"110\"\n" + "\t\t}]\n" + "\t}, {\n" + "\t\t\"age\": 19,\n" + "\t\t\"name\": \"李四\",\n" + "\t\t\"course\":[{\n" + "\t\t\t\"Chinese\":\"118\",\n" + "\t\t \t\"Maths\":\"129\",\n" + "\t\t \t\"English\":\"130\"\n" + "\t\t}]\n" + "\t}, {\n" + "\t\t\"age\": 18,\n" + "\t\t\"name\": \"王麻子\",\n" + "\t\t\"course\":[{\n" + "\t\t\t\"Chinese\":\"133\",\n" + "\t\t \t\"Maths\":\"111\",\n" + "\t\t \t\"English\":\"134\"\n" + "\t\t}]\n" + "\t}]\n" + "}"; List<Object> returnObject=new ArrayList<>(); getData(returnObject,new JSONObject(jsonStr),"members,course".split(","),0); System.out.println(returnObject); returnObject=new ArrayList<>(); getData(returnObject,new JSONObject(jsonStr),"members,course,Chinese".split(","),0); System.out.println(returnObject); } 輸出結果: [[{"Maths":"121","English":"110","Chinese":"123"}], [{"Maths":"129","English":"130","Chinese":"118"}], [{"Maths":"111","English":"134","Chinese":"133"}]] [123, 118, 133]