jackson 反序列化具有动态属性名称的对象数组

sgtfey8w  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(131)

我有一个接受JSON的服务,如下所示

[
   {
      "key1": "value1"
   },
   {
      "key2": "value2"
   },
   {
      "key3": "value3"
   }
]

我试过List〈Map.Entry〈String,String〉〉(和几个具体的实现),但是它不起作用。有什么想法可以Map动态属性名吗?

dfuffjeb

dfuffjeb1#

动态属性名称是一个噩梦(关于键名有什么规则吗?)。您应该瞄准这样的结构:

[
   {
      "key": "key1"
      "value": "value1"
   },
   {
      "key": "key2"
      "value": "value2"
   },
   {
      "key": "key3"
      "value": "value3"
   }
]

你可以通过改变输入的json字符串来匹配上述结构,然后将其传递到一个普通的json解析器中来实现。

gv8xihay

gv8xihay2#

您也可以使用List将其反序列化,然后将所有检索到的项强制转换为Map。这是可能的,因为Jackson会在内部将每个数组元素反序列化为Map(作为通用后备)。

List<?> list = objectMapper.readValue(new File("1.json"), List.class);
// assuming there exists an item
Map<?,?> item1 = list.get(0);
// .. use map with dynamic keys (you known values are strings, so cast)
String value1 = (String) map.get("key1");

对于一个巨大的JSON数组来说,这是相当低效的(因为它会创建大量的单例Map)。因此,在这些情况下,@Eskapone提出的解决方案(如果你可以改变输入JSON的模式)更好。

相关问题