2017-04-21 75 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", ... 
      ] 

     } 
    ] 
}