I'm trying to parse below json file:
{"units":[{"id":42, "title":"Hello World", "position":1, "v_id":9, "sites":[[{"id":316, "article":42, "clip":133904 }], {"length":5}] }, ..]} This is what I have tried:
Object obj = null; JSONParser parser = new JSONParser(); Object unitsObj = parser.parse(new FileReader("file.json"); JSONObject unitsJson = (JSONObject) unitsObj; JSONArray units = (JSONArray) unitsJson.get("units"); Iterator<String> unitsIterator = units.iterator(); while(unitsIterator.hasNext()){ Object uJson = unitsIterator.next(); JSONObject uj = (JSONObject) uJson; obj = parser.parse(uj.get("sites").toString()); JSONArray jsonSites = (JSONArray) obj; for(int i=0;i<jsonSites.size();i++){ JSONObject site = (JSONObject)jsonSites.get(i); // Exception happens here. System.out.println(site.get("article"); } } The code is not working when I try to parse the inner json array, so I get:
Exception in thread "main" java.lang.ClassCastException: org.json.simple.JSONArray cannot be cast to org.json.simple.JSONObject The exception is pointing to this line:
JSONObject site = (JSONObject)jsonSites.get(i); Any help? tnx.
110 Answers
I've found a working code:
JSONParser parser = new JSONParser(); Object obj = parser.parse(content); JSONArray array = new JSONArray(); array.add(obj); If you don't need the array (like the author), you can simply use
JSONParser parser = new JSONParser(); Object obj = parser.parse(content); 1The first element of the sites array is an array, as you can see indenting the JSON:
{"units":[{"id":42, ... "sites": [ [ { "id":316, "article":42, "clip":133904 } ], {"length":5} ] ... } Therefore you need to treat its value accordingly; probably you could do something like:
JSONObject site = (JSONObject)(((JSONArray)jsonSites.get(i)).get(0)); 2this worked:
System.out.println("resultList.toString() " + resultList); org.json.JSONObject obj = new JSONObject(resultList); org.json.JSONArray jsonArray = obj.getJSONArray(someField); for(int i=0;i<jsonArray.length();i++){ System.out.println("array is " + jsonArray.get(i)); } JSONObject site=jsonSites.getJSONObject(i) should work out
JSONObject obj=(JSONObject)JSONValue.parse(content); JSONArray arr=(JSONArray)obj.get("units"); System.out.println(arr.get(1)); //this will print {"id":42,...sities ..} @cyberz is right but explain it reverse
0You can first read the whole content of file into a String.
FileInputStream fileInputStream = null; String data=""; StringBuffer stringBuffer = new StringBuffer(""); try{ fileInputStream=new FileInputStream(filename); int i; while((i=fileInputStream.read())!=-1) { stringBuffer.append((char)i); } data = stringBuffer.toString(); } catch(Exception e){ LoggerUtil.printStackTrace(e); } finally{ if(fileInputStream!=null){ fileInputStream.close(); } } Now You will have the whole content into String ( data variable ).
JSONParser parser = new JSONParser(); org.json.simple.JSONArray jsonArray= (org.json.simple.JSONArray) parser.parse(data); After that you can use jsonArray as you want.
0If you want to re-filter the json data you can use following method. Given example is getting all document data from couchdb.
{ Gson gson = new Gson(); String resultJson = restTemplate.getForObject(url+"_all_docs?include_docs=true", String.class); JSONObject object = (JSONObject) new JSONParser().parse(resultJson); JSONArray rowdata = (JSONArray) object.get("rows"); List<Object>list=new ArrayList<Object>(); for(int i=0;i<rowdata.size();i++) { JSONObject index = (JSONObject) rowdata.get(i); JSONObject data = (JSONObject) index.get("doc"); list.add(data); } // convert your list to json String devicelist = gson.toJson(list); return devicelist; } JSONObject site = (JSONObject)jsonSites.get(i); // Exception happens here. The return type of jsonSites.get(i) is JSONArray not JSONObject. Because sites have two '[', two means there are two arrays here.
use your jsonsimpleobject direclty like below
JSONObject unitsObj = parser.parse(new FileReader("file.json"); JSONObject baseReq LinkedHashMap insert = (LinkedHashMap) baseReq.get("insert"); LinkedHashMap delete = (LinkedHashMap) baseReq.get("delete"); 2