繁体   English   中英

用名称解码列表的JSON字符串

[英]Decoding JSON String for List with names

我尝试如下解码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的以下异常。 它们都是list,但是为什么它失败了而为另一个失败。

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>

任何输入都会有所帮助。

谢谢 !!

id_value不属于您的IdValue POJO。 因此,列表的TypeToken不知道如何映射JSON字符串的id_value。

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");

这是从jsonString1获取IdValues更通用的方法,即使其中还有其他条目:

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());

因为jsonString1的反序列化类型与jsonString2的反序列化类型不同。 如果要使用相同的反序列化类型,则应首先执行子字符串。

jsonString1 = jsonString1.substring(s.indexOf("["));
jsonString1 = jsonString1.substring(0, s.lastIndexOf("]") + 1);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM