org.json.simple.JSONArray cannot be cast to org.json.simple.JSONObject

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.

1

10 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); 
1

The 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)); 
2

this 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

3
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

0

You 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.

0

If 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

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like