我有这样的JSON响应。
{
"array": [
{
"object1": {
"aa": "somevalue1",
"bb": "somevalue2",
"cc": "somevalue3"
}
},
{
"object2": {
"aa": "somevalue4",
"bb": "somevalue5",
"cc": "somevalue6"
}
}
]}
现在我可以从上面的响应中获取一个JSON数组。我想从aa
中的对象bb
和cc
读取值object1
,object2
,for loop
。
JSON是动态的,我的意思是object2
也可以出现在object1
之前(以相反的顺序),并且我可能会再获得一个具有相同结构的对象(object3
)或者只有一个(object1
或object2
或object3
)。
我不想这样做,因为我失败了:
JSONArray jsonArray = json.getJSONArray("array");
for (int i = 0; i < jsonArray.length(); i++)
{
JSONObject jsonObject = jsonArray.getJSONObject(i).getJSONObject("object1");
}
所以我的问题是如何在不依赖于对象名称或对象数量aa
或{{1}的情况下阅读这些值bb
,cc
,object1
}或object2
)?
答案 0 :(得分:1)
我认为你应该有下一个类的Java端结构:
Entity
- 将保留aa
,bb
和cc
字段的课程
Container
- 一个由两个字段组成的类 - Name
和Entity
,其中Name
可以存储object1
,{{1或者其他什么。
然后,您应该将提供的JSON反序列化为object2
实体的集合/数组。
希望这有帮助。
更新:请查看此示例Collection deserialization
答案 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对象。
答案 2 :(得分: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;
}