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

Deserialize array of objects with dynamic property name

我有一个接受 JSON 这样的服务

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

我正在尝试找到一种反序列化它的方法。我试过 List> (以及几个具体实现)但它不起作用。有什么想法可以映射动态 属性 名称吗?

动态 属性 名称是一场噩梦(有没有关于键名的规则?)。您应该以这样的结构为目标:

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

您可以通过更改输入 json 字符串以匹配所述结构来实现此目的。然后将其传递给普通的 json 解析器。

您也可以使用 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 数组,它会相当低效(因为它会创建大量的单例映射)。因此,@Eskapone 提出的解决方案(如果您可以更改输入模式 JSON)在这些情况下更好。