2014-10-27 44 views
2

我有這樣的JSON響應。如何使用動態鍵名解析JSON?

{ 
"array": [ 
    { 
     "object1": { 
      "aa": "somevalue1", 
      "bb": "somevalue2", 
      "cc": "somevalue3" 
     } 
    }, 
    { 
     "object2": { 
      "aa": "somevalue4", 
      "bb": "somevalue5", 
      "cc": "somevalue6" 
     } 
    } 
]} 

現在我可以從上面的響應得到一個JSON數組。我想要從對象object1object2中讀取值aabb,cc,for loop

JSON是動態的,我的意思是object2也可以object1出現之前(以相反的順序),而且是我可能會多了一個對象(object3)具有相同的結構或機會只有一個(object1object2object3)。

我不想做這樣的,因爲我的失敗:

JSONArray jsonArray = json.getJSONArray("array"); 
for (int i = 0; i < jsonArray.length(); i++) 
{ 
    JSONObject jsonObject = jsonArray.getJSONObject(i).getJSONObject("object1"); 
} 

所以我的問題是我怎麼能讀取這些值aabbcc而不依賴於對象名稱或對象的數量(object1object2object3)?

回答

1

它看起來像的每個項目陣列中只有1鍵/值對,其保持另一個JSON對象,然後有幾個。

如果是這種情況,那麼你很可能做這樣的事情:

for (int i = 0; i < jsonArray.length(); i++) 
{ 
    JSONObject jsonObject = jsonArray.getJSONObject(i); 

    JSONObject innerObject = jsonObject.getJSONObject(jsonObject.keys().next().toString()); 

    /// do something with innerObject which holds aa, bb, cc 
} 

你只需搶到包裝對象的第一個鍵,並用它來抓取內JSON對象。

+0

謝謝,我在尋找如何獲得鍵名動態,以便我可以跳過寫getJSONObject(「object1」)或getJSONObject(「object2」)'。 再次感謝 – user3677365 2014-10-27 11:17:47

1

我想你應該有類下一個Java端結構:

  1. Entity - 類,將舉行aabbcc領域

  2. Container - 一類,將包含兩個字段 - NameEntity,其中Name可以存儲object1object2或其他。

然後,您應該反序列化提供的JSON到Container實體的集合/數組中。

希望這會有所幫助。

更新:請檢查這個例子Collection deserialization

0

您應該使用動態結構,如java.util.Map。試試這個:

import java.util.List; 
import java.util.Map; 

import org.apache.commons.lang.StringUtils; 
import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.type.TypeReference; 

public class JsonTest { 

    public static void main(String[] args) { 
     String json = "{\"array\": [{\"object1\": {\"aa\": \"somevalue1\",\"bb\": \"somevalue2\",\"cc\": \"somevalue3\"}},{\"object2\": {\"aa\": \"somevalue4\",\"bb\": \"somevalue5\",\"cc\": \"somevalue6\"}}]}"; 
     System.out.println(json); 
     final MyJson parseJsonSpecification = parseJsonSpecification(json); 
     System.out.println(parseJsonSpecification.array.get(0).get("object1")); 
     System.out.println(parseJsonSpecification); 
    } 

    public static MyJson parseJsonSpecification(String jsonString) { 
     try { 
      if (StringUtils.isBlank(jsonString)) { 
       return new MyJson(); 
      } 
      MyJson ret; 
      ret = new ObjectMapper().readValue(jsonString, new TypeReference<MyJson>() { 
      }); 
      return ret; 
     } catch (Exception ex) { 
      throw new IllegalArgumentException("La expresión '" + jsonString + "' no es un JSON válido", ex); 
     } 
    } 
} 

class MyJson { 
    public List<Map<String, Object>> array; 
}