我是android的新手,我有一个带动态键的JSON文件,如下所示:
{
"x": {
"a": {
"1": [1,2,3,4],
"2": [1,2,3,4]
},
"b": {
"1": [1,2,3,4],
"2": [1,2,3,4]
}
},
"y": {
"a": {
"1": [1,2,3,4],
"2": [1,2,3,4]
},
"b": {
"1": [1,2,3,4],
"2": [1,2,3,4]
}
},
"z": {
"a": {
"1": [1,2,3,4],
"2": [1,2,3,4]
},
"b": {
"1": [1,2,3,4],
"2": [1,2,3,4]
}
}
}
我通过JSONObject成功解析了它,但我必须通过x,y,z上的键Iterator循环。每次,我必须循环a,b和“1”和“2”相同。我认为这不是一个好的解决方案。我为他们创建了这样的模型:
Class XYZ {
private String name; // "x", "y", "z" value
private ArrayList<ABC> abcList;
}
Class ABC {
private String name; // "a", "b", "c"
private ArrayList<Item> itemList;
}
Class Item{
private String ID; // "1", "2"
private int[] valueArray;
}
任何人都可以帮我解析Gson的这个json,我觉得它看起来更专业:D。非常感谢你
答案 0 :(得分:0)
您的模型无法映射您的JSON,因为Gson默认配置显然无法匹配。
您可以使用两种“默认”方式:
...因为你没有真正提到为什么你的JSON被认为是动态的:
final class XYZ {
final ABC x = null;
final ABC y = null;
final ABC z = null;
}
final class ABC {
final OneTwo a = null;
final OneTwo b = null;
}
final class OneTwo {
@SerializedName("1")
final List<Integer> one = null;
@SerializedName("2")
final List<Integer> two = null;
}
示例:
try ( final Reader reader = getPackageResourceReader(Q43695739.class, "dynamic.json") ) {
final XYZ xyz = gson.fromJson(reader, XYZ.class);
System.out.println(xyz.x.b.two);
}
...假设您的密钥是动态的,但结构保持不变:
private static final Type stringToStringToStringToIntegerListType = new TypeToken<Map<String, Map<String, Map<String, List<Integer>>>>>() {
}.getType();
try ( final Reader reader = getPackageResourceReader(Q43695739.class, "dynamic.json") ) {
final Map<String, Map<String, Map<String, List<Integer>>>> m = gson.fromJson(reader, stringToStringToStringToIntegerListType);
System.out.println(m.get("x").get("b").get("2"));
}
另一种真正的动态方法可能对某些情况有所帮助。另请注意,JSONObject
不在Gson领域:您可能从org.json
包中导入了这个。 Gson使用像JsonElement
,JsonObject
等骆驼名称。
try ( final Reader reader = getPackageResourceReader(Q43695739.class, "dynamic.json") ) {
final JsonElement jsonElement = gson.fromJson(reader, JsonElement.class)
.getAsJsonObject()
.getAsJsonObject("x")
.getAsJsonObject("b")
.getAsJsonArray("2");
System.out.println(jsonElement);
}
第一个和第二个示例生成java.util.List
个实例
[1,2,3,4]
第三个示例返回JsonArray
实例,其实现略有不同{/ 1}:
[1,2,3,4]