我尝试解码JSON字符串,如下所示
{
"id_value": [
{
"id": "1.1.1.1",
"value": "v1"
},
{
"id": "1.1.1.2",
"value": "v2"
}
]
}
这基本上是id_value对象的列表。 IdValue是一个POJO类,其字符串变量为id和value。
当我传入没有列表名称的JSON时,我能够解码JSON字符串,如下所示。
[
{
"id": "1.1.1.1",
"value": "v1"
},
{
"id": "1.1.1.2",
"value": "v2"
}
]
我的JAVA代码如下:
String jsonString1 = "{\"id_value\": [{\"id\": \"1.1.1.1\",\"value\": \"v1\"},{\"id\": \"1.1.1.2\",\"value\": \"v2\"}]}";
String jsonString2 = "[{\"id\": \"1.1.1.1\",\"value\": \"v1\"},{\"id\": \"1.1.1.2\",\"value\": \"v2\"}]";
List<IdValue> idValues = null;
try {
Gson gson = new Gson();
idValues = gson.fromJson(jsonString2, new TypeToken<List<IdValue>>(){}.getType());
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println(idValues);
我的代码适用于jsonString2,但我使用jsonString1获得以下异常。它们都是列表,但为什么它失败了,为其他人工作。
com.google.gson.JsonParseException: The JsonDeserializer com.google.gson.DefaultTypeAdapters$CollectionTypeAdapter@67ac19 failed to deserialize json object {"id_value":[{"id":"1.1.1.1","value":"v1"},{"id":"1.1.1.2","value":"v2"}]} given the type java.util.List<com.something.json.IdValue>
任何输入都会有所帮助。
谢谢!
答案 0 :(得分:1)
id_value不是您的IdValue POJO的一部分。所以List的TypeToken不知道如何映射JSON字符串的id_value片段。
答案 1 :(得分:1)
jsonString2
代表List<IdValue>
jsonString1
代表Map<String, List<IdValue>>
因此,要处理jsonString1
,您需要:
Map<String, List<IdValue>> map = gson.fromJson(json, new TypeToken<Map<String, List<IdValue>>>(){}.getType());
List<idValue> idValues = map.get("id_value");
以下是从IdValues
获取jsonString1
的更一般方法,即使其中还有其他条目:
Gson gson = new Gson();
JsonParser parser = new JsonParser();
String jsonString1 = "{\"id_value\": [{\"id\": \"1.1.1.1\",\"value\": \"v1\"},{\"id\": \"1.1.1.2\",\"value\": \"v2\"}]}";
JsonElement e = parser.parse(jsonString1);
JsonArray idValueArray = e.getAsJsonObject().getAsJsonArray("id_value");
List<IdValue> idValues = gson.fromJson(idValueArray, new TypeToken<List<IdValue>>(){}.getType());
答案 2 :(得分:0)
因为jsonString1的反序列化类型与jsonString2不相同。如果要使用相同的反序列化类型,则应首先执行子串。
jsonString1 = jsonString1.substring(s.indexOf("["));
jsonString1 = jsonString1.substring(0, s.lastIndexOf("]") + 1);