反序列化具有动态 属性 名称的对象数组
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)在这些情况下更好。
我有一个接受 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)在这些情况下更好。