2017-04-21 76 views
2

我有一个类似于下面的结构(帖子结尾)的JSON。我试图从文件中读取它,然后提取一些信息。我想要得到“时代”的孩子,并用它做一些事情。我试过使用json.simple和一些杰克逊的东西,但我不断收到铸造/类型错误。我很坚持:/Java如何访问JSON内部子数组

首先,我在文件中读取,它似乎正确采集:

JSONParser parser = new JSONParser(); 
JSONObject data = (JSONObject) parser.parse(new FileReader("test.json")); 

我又试图跟随这名:Java JSONObject get children 但得到的错误org.json.simple.JSONArray cannot be cast to org.json.simple.JSONObject

我想要(想想是我想要的)做的是沿着线条创建一个JSON的时代,然后从那里我可以列出时间/对它们进行各种操作。或者,最好的方法是使用ObjectMapper并将其映射到匹配的对象?

{ 
    "id": "ca1b57be-6c38-4976-9050-f9a95a05a38d", 
    "name": "some name", 
    "results": [ 
     { 
      "name": "https://st-dev.aexp.com/smart-test/v1/test/test", 
      "tests": { 
       "name": "Body matches string", 
       "status": "pass", 
       "Response time is less than 200ms": true 
      }, 
      "testPassFailCounts": { 
       "Body matches string": { 
        "pass": 100, 
        "fail": 0 
       }, 
       "Response time is less than 200ms": { 
        "pass": 100, 
        "fail": 0 
       } 
      }, 
      "times": [ 
       "48", 
       "25", 
       "25", 
       "28", 
       "24", 
       "24", 
       "35", 
       "29", 
       "41", 
       "28", 
       "28", 
       "24", 
       "31", 
       "28", 
       "25", 
       "27", 
       "23", 
       "28", 
       "44", 
       "29", 
       "25", 
       "23", 
       "44", 
       "28", 
       "22" 
      ] 
     } 
    ]  
} 

非常感谢您的帮助!

回答

0

有可能是这样做的更好的方法,但使用杰克逊的ObjectMapper,这里有一个解决方案:

String json = readJSON(); // <- read the JSON from somewhere as a plain String 
Map<String, Object> jsonDocument = new ObjectMapper() 
      .readValue(json, new TypeReference<Map<String, Object>>() {}); 

List<Object> resultsList = (List<Object>) jsonDocument.get("results"); 
Map<String, Object> resultsMap = (Map<String, Object>) resultsList.get(0); 
List<Integer> times = (List<Integer>) resultsMap.get("times"); 

// process the times 

基本上,你的榜样JSON只推广到Map<String, Object>,您可以通过元素需要再处理元素,检查文件并添加相应的班级人员(MapList)。 Jackson将0123的JSON名称 - 值对(在文档中由{}s表示)转换为Maps和阵列(由[]s表示),作为Lists。上面的代码片段假定results的值始终是单元素列表。

4

这是另一个使用json.org库的实现。

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

public class ProcessJson { 
    public void test(String str) throws JSONException { 
     JSONObject json = new JSONObject(str); //initial JSONObject (See explanation section below) 
     JSONArray jsonArray = json.getJSONArray("results"); //"results" JSONArray 
     JSONObject item = jsonArray.getJSONObject(0); //first JSONObject inside "results" JSONArray 
     JSONArray jsonArrayTimes = item.getJSONArray("times"); //"times" JSONArray 

     for (int i = 0; i < jsonArrayTimes.length(); i++) { 
      System.out.println(jsonArrayTimes.getInt(i)); 
     } 
    } 
} 

在Maven的pom.xml中的依赖

<dependencies> 
    <!-- https://mvnrepository.com/artifact/org.json/json --> 
    <dependency> 
     <groupId>org.json</groupId> 
     <artifactId>json</artifactId> 
     <version>20160810</version> 
    </dependency> 
</dependencies> 

输出是:

48 
25 
25 
28 
24 
24 
35 
29 
41 
28 
28 
24 
31 
28 
25 
27 
23 
28 
44 
29 
25 
23 
44 
28 
22 

说明:

{ } = JSONObject 
[ ] = JSONArray 

“泰晤士报” JSONArray嵌套在第一个“结果”JSONAr的JSONObject射线。

这里是简化结构:

{ 
    "results": [ 
     { 
      "times": [ 
       "48", 
       "25", ... 
      ] 

     } 
    ] 
}