解析gson中的动态Json对象
问题描述:
我有这样的json结构,我如何在Gson的帮助下解析json。我需要将关键值存储在json对象中,我尝试了很多与动态数组相关的示例,但没有使用动态json数组方括号我不能解析使用Gson.Any解决方案或需要做手动Json解析?如果任何人感到重复评论下面的答案。解析gson中的动态Json对象
{ "Result":[[
"Title",
{
"0": 1323,
"1": 3358,
"2": 2123,
"3": 8536,
"4": 1399,
"5": 9303,
"7": 9732,
"8": 3433,
"9": 1383
}
],[
"Title",
{
"0": 1323,
"1": 3358,
"2": 2123,
"3": 8536,
}
]]}
答
要开始,你的JSON导致异常被抛出,因为它是无效的 - 你必须在第二个例子中的最后一个值的末尾一个额外的逗号。 "3": 8536,
应该是"3": 8536
。
修复后,这应该是一个简单的任务,只要你正确定义你的对象。以下是我想出了:
public class Results {
@SerializedName("Result")
List<Result> results;
}
public class Result {
String title;
Map<String, Integer> results;
}
从那里,Result
类需要在一个特殊的方式来反序列化,因为在Result
类中的字段不直接映射到JSON条目。相反,我们需要取消每个Result
中包含的JsonArray
的第一个和第二个元素,并相应地对其进行解析。看起来像这样:
public class ResultDeserializer implements JsonDeserializer<Result> {
@Override
public Result deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonArray array = json.getAsJsonArray();
Result result = new Result();
result.title = array.get(0).getAsString();
result.results = new LinkedHashMap<String, Integer>();
for(Entry<String, JsonElement> entry : array.get(1).getAsJsonObject().entrySet()) {
result.results.put(entry.getKey(), entry.getValue().getAsInt());
}
return result;
}
}
请注意,我的示例省略了错误检查。最后,注册这个解串器,你应该准备就绪:
Gson gson = new GsonBuilder().registerTypeAdapter(Result.class, new ResultDeserializer()).create();
Results results = gson.fromJson(json, Results.class);
for(Result r : results.results) {
System.out.println("Title = " + r.title);
for(Entry<String, Integer> entry : r.results.entrySet()) {
System.out.println("\t " + entry.getKey() + " -> " + entry.getValue());
}
}
此打印:
Title = Title
0 -> 1323
1 -> 3358
2 -> 2123
3 -> 8536
4 -> 1399
5 -> 9303
7 -> 9732
8 -> 3433
9 -> 1383
Title = Title
0 -> 1323
1 -> 3358
2 -> 2123
3 -> 8536
我要把它留给OP实行反向,那就是为Result
到串行产生相同的结果。
答
找到简单的方式在GSON
Result.java
public class Result {
@SerializedName("formatted_facet_fields")
Map<String,Map<String,String>> formatted_facet_fields;
}
来解析上述使用嵌套地图 JSON响应接收侧
Gson gson=new Gson();
Result result = gson.fromJson(json_response, Result.class);
怎么样[ MCVE] – jkalden
在你的Json数据中,标题是必需的......或者任何类似于“Title:xyz”的标签 –
@ Don'tBenegative“标题”是一个没有键的对象,不像你提到的那样。 – appukrb