我有一个JSON,其结构与下面的结果类似(帖子结尾)。我正试图从文件中读取它然后提取一些信息。我想得到“时代”的孩子并用它做点什么。我已经尝试过使用json.simple和一些jackson的东西,但我一直在进行转换/类型错误。我很困惑:/
首先我在文件中读到它似乎被正确捕获:
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 :(得分: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
“times”JSONArray嵌套在“results”JSONArray的第一个JSONObject中。
这是简化的结构:
{
"results": [
{
"times": [
"48",
"25", ...
]
}
]
}
答案 1 :(得分: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>
,然后您需要逐个元素处理,检查文档并添加相应的类别转换(Map
或List
)。 Jackson将JSON的名称 - 值对(在文档中由{}
表示)转换为Map
s,将数组(由[]
s表示)转换为List
s。上面的代码段假定results
的值始终是单个元素列表。