Java 解码带有名称的列表的JSON字符串

Java 解码带有名称的列表的JSON字符串,java,json,gson,Java,Json,Gson,我尝试解码一个JSON字符串,如下所示 { "id_value": [ { "id": "1.1.1.1", "value": "v1" }, { "id": "1.1.1.2", "value": "v2" } ] } 这基本上是一个id_值对象的列表。IdValue是一个POJO类,其字符串变量为id和value 我能够解码JSON字符串,当我传入JSON时没有列表名,如下所示

我尝试解码一个JSON字符串,如下所示

{
   "id_value": [
    {
        "id": "1.1.1.1",
        "value": "v1"
    },
    {
        "id": "1.1.1.2",
        "value": "v2"
    }
   ]
}
这基本上是一个id_值对象的列表。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);
String jsonString1=“{\'id\'u value\”:[{\'id\':\'1.1.1\',\'value\':\'v1\',{\'id\':\'1.1.2\',\'value\':\'v2\'}”;
字符串jsonString2=“[{\'id\':\'1.1.1\',\'value\':\'v1\',{\'id\':\'1.1.1\',\'value\':\'v2\'”;
列表idValues=null;
试一试{
Gson Gson=新的Gson();
idValues=gson.fromJson(jsonString2,newTypeToken(){}.getType());
}
捕获(例外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>
com.google.gson.JsonParseException:JsonDeserializer com.google.gson.DefaultTypeAdapters$CollectionTypeAdapter@67ac19无法反序列化json对象{“id_value”:[{“id”:“1.1.1.1”,“value”:“v1”},{“id”:“1.1.1.2”,“value”:“v2”}]}给定类型java.util.List
任何投入都会有帮助


谢谢

id\u值不是IdValue POJO的一部分。因此,List的TypeToken不知道如何映射JSON字符串的id\u值块。

jsonString2
表示一个
List

jsonString1
表示一个
Map

因此,要处理
jsonString1
,您需要:

Map<String, List<IdValue>> map = gson.fromJson(json, new TypeToken<Map<String, List<IdValue>>>(){}.getType());
List<idValue> idValues = map.get("id_value");

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

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

有其他方法吗?你可以编写一个自定义反序列化程序,或者按照周飞宇的建议去做。我确实在做,但是这样做,如果明天我想在JSON类名称和列表中添加更多元素,那就很困难了。@Stacker1234好的,我想我明白你想要什么了,我马上编辑我的答案。
jsonString1 = jsonString1.substring(s.indexOf("["));
jsonString1 = jsonString1.substring(0, s.lastIndexOf("]") + 1);