我有一个接受JSON的服务,如下所示
[ { "key1": "value1" }, { "key2": "value2" }, { "key3": "value3" } ]
我试过List〈Map.Entry〈String,String〉〉(和几个具体的实现),但是它不起作用。有什么想法可以Map动态属性名吗?
dfuffjeb1#
动态属性名称是一个噩梦(关于键名有什么规则吗?)。您应该瞄准这样的结构:
[ { "key": "key1" "value": "value1" }, { "key": "key2" "value": "value2" }, { "key": "key3" "value": "value3" } ]
你可以通过改变输入的json字符串来匹配上述结构,然后将其传递到一个普通的json解析器中来实现。
gv8xihay2#
您也可以使用List将其反序列化,然后将所有检索到的项强制转换为Map。这是可能的,因为Jackson会在内部将每个数组元素反序列化为Map(作为通用后备)。
List
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的模式)更好。
2条答案
按热度按时间dfuffjeb1#
动态属性名称是一个噩梦(关于键名有什么规则吗?)。您应该瞄准这样的结构:
你可以通过改变输入的json字符串来匹配上述结构,然后将其传递到一个普通的json解析器中来实现。
gv8xihay2#
您也可以使用
List
将其反序列化,然后将所有检索到的项强制转换为Map
。这是可能的,因为Jackson会在内部将每个数组元素反序列化为Map
(作为通用后备)。对于一个巨大的JSON数组来说,这是相当低效的(因为它会创建大量的单例Map)。因此,在这些情况下,@Eskapone提出的解决方案(如果你可以改变输入JSON的模式)更好。