String s = "{\"FOO\": 123}";
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(s);
node.get("foo"); // this should return the "FOO" field
public JsonNode createNode()
{
Map<String, List<String>> table = new HashMap<>();
table.put("first", new ArrayList<>(Arrays.asList("firstprop1", "firstprop2")));
table.put("second", new ArrayList<>(Arrays.asList("secondprop1", "secondprop2")));
table.put("third", new ArrayList<>(Arrays.asList("thirdprop1", "thirdprop2")));
return new ObjectMapper().valueToTree(table);
}
3条答案
按热度按时间wooyq4lh1#
没有自动化的方法,但您可以通过创建自定义的JsonNodeFactory来创建自定义的ObjectNode-然后您可以重写用于添加和访问条目的方法。
o2gm4chl2#
此功能自2.5(2015年1月)起可用:
ACCEPT_CASE_INSENSITIVE_PROPERTIES
允许对传入的JSON进行更宽容的格式化的特性。如果启用,bean属性将使用它们的小写等效项进行匹配,这意味着任何大小写组合(传入和匹配的名称通过小写规范化)应该可以。注意,由于传入的属性名称在比较之前需要小写,因此存在额外的性能开销,对于有大写字母的情况。对于已经是小写字母的名称的开销应该可以忽略不计。
默认情况下禁用该功能。
https://fasterxml.github.io/jackson-databind/javadoc/2.5/com/fasterxml/jackson/databind/MapperFeature.html
flseospp3#
不幸的是,正如其他人所指出的,Jackson的
JsonNode
并没有提供一个不区分大小写的键查找的内部特性。然而,幸运的是,大多数JsonNode
可以很容易地转换为一个map,还有一些其他的Map
实现实际上提供了一个不区分大小写的查找。其中最简单的是Spring'sLinkedCaseInsensitiveMap
,但是Java'sTreeMap
也可以工作。我们所要做的就是将JsonNode转换为所选的Map,并在那里进行查找。我在下面列出了一些示例,我使用下面的方法创建一个JsonNode,用于这些类;
字符串
LinkedCaseInsensiveMap
如果你正在使用Spring,我推荐使用
LinkedCaseInsensitiveMap
。你不需要更新你的依赖项,它“保留了键的原始顺序和原始大小写,同时允许包含,获取和删除任何键的调用。”示例
型
TreeMap
TreeMap
是普通的java解决方案。TreeMap
采用自定义比较器作为构造函数参数。您可以使用String捆绑的比较器CASE_INSENSITIVE_ORDER
来创建不区分大小写的比较器。示例
型
测试
上述方法适用于以下测试。
型
限制条件
请注意,上面的例子只适用于创建一个
Map<String, List>
。这意味着它不适用于OP的例子,它Map的是一个整数,而不是一个列表。然而,我们可以修改它,使用java泛型动态分配内部类。示例
型
测试
现在,通过上述修改,我们可以测试OP示例并成功获得正确的结果。
型
我们还可以使用我们以前的测试,稍作修改,也得到相同的结果。
型