16

我正在尝试解析以下json文件:

{"units":[{"id":42,               
   "title":"Hello World",          
    "position":1,
    "v_id":9,
    "sites":[[{"id":316,
      "article":42,
      "clip":133904
        }],
       {"length":5}]

   }, ..]}

这是我尝试过的:

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");
    }
}

当我尝试解析 inner 时,代码不起作用json array,所以我得到:

Exception in thread "main" java.lang.ClassCastException: org.json.simple.JSONArray cannot be cast to org.json.simple.JSONObject

例外是指向这一行:

JSONObject site = (JSONObject)jsonSites.get(i);

有什么帮助吗?tnx。

4

10 回答 10

25

我找到了一个工作代码:

JSONParser parser = new JSONParser();
Object obj  = parser.parse(content);
JSONArray array = new JSONArray();
array.add(obj);

如果您不需要数组(如作者),您可以简单地使用

JSONParser parser = new JSONParser();
Object obj  = parser.parse(content);
于 2014-10-31T14:57:26.653 回答
7

数组的第一个元素sites是一个数组,您可以看到缩进 JSON:

{"units":[{"id":42,               
    ...
    "sites":
    [
      [
        {
          "id":316,
          "article":42,
          "clip":133904
        }
      ],
      {"length":5}
    ]
    ...
}

因此,您需要相应地对待它的价值;也许你可以做类似的事情:

JSONObject site = (JSONObject)(((JSONArray)jsonSites.get(i)).get(0));
于 2013-08-26T08:50:39.603 回答
2

这有效:

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

            }
于 2016-02-24T20:37:08.523 回答
1

JSONObject site=jsonSites.getJSONObject(i)应该解决

于 2013-08-26T08:53:31.710 回答
1
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 是对的,但要反过来解释

于 2015-09-18T03:24:11.140 回答
1

您可以先将文件的全部内容读入字符串。

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();
    }
}

现在您将把全部内容放入字符串(数据变量)中。

JSONParser parser = new JSONParser();
org.json.simple.JSONArray jsonArray= (org.json.simple.JSONArray) parser.parse(data);

之后,您可以根据需要使用 jsonArray 。

于 2016-03-31T11:54:51.230 回答
1

如果要重新过滤 json 数据,可以使用以下方法。给定的示例是从 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;
}
于 2019-08-08T12:28:37.297 回答
1
JSONObject site = (JSONObject)jsonSites.get(i); // Exception happens here.

的返回类型jsonSites.get(i)不是。因为站点有两个'[',所以两个意味着这里有两个数组。JSONArrayJSONObject

于 2019-08-22T07:14:48.637 回答
0

使用你的 jsonsimpleobject 直接如下

JSONObject unitsObj = parser.parse(new FileReader("file.json");
于 2014-12-10T10:22:48.850 回答
0
JSONObject baseReq
LinkedHashMap insert = (LinkedHashMap) baseReq.get("insert");
LinkedHashMap delete = (LinkedHashMap) baseReq.get("delete");
于 2019-04-02T13:48:20.423 回答