[英]Use of Jayway JsonPath with Jackson
我一直在使用JsonPath
。 但是,在昨天的一个问题中,我发现默认的JsonSmartJsonProvider
在解析时未报告无效文档错误,我修改了设置以使用Jackson
public JsonPathExtractor(String document) throws DocumentFormatException
{
try
{
Configuration.setDefaults(new Configuration.Defaults()
{
private final JsonProvider jsonProvider = new JacksonJsonProvider();
private final MappingProvider mappingProvider = new JacksonMappingProvider();
@Override
public JsonProvider jsonProvider()
{
return jsonProvider;
}
@Override
public MappingProvider mappingProvider()
{
return mappingProvider;
}
@Override
public Set<Option> options()
{
return EnumSet.noneOf(Option.class);
}
});
// Get an object representation of the JSON to allow values to be extracted
this.document = Configuration.defaultConfiguration().jsonProvider().parse(document);
}
catch(Exception e)
{
throw new DocumentFormatException("Invalid JSON document", e);
}
}
但是,我看到了行为上的差异,因为如果我得到的路径包含几个字段,则在使用JsonSmartJsonProvider
时它们不会被引用。
JSON范例
{
"firstName": "John",
"lastName": "Smith",
"isAlive": true,
"age": 25,
"height_cm": 167.6,
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021-3100"
},
"phoneNumbers": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "office",
"number": "646 555-4567"
}
],
"children": [],
"spouse": null
}
致电:
Object obj = JsonPath.read(document, "$.phoneNumbers");
当使用JacksonMappingProvider
我得到
[{type=home, number=212 555-1234}, {type=office, number=646 555-4567}]
当使用JsonSmartJsonProvider
我得到:
[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}]
如果我想让杰克逊以同样的方式行事,还有其他可以配置的东西吗?
Jackson处理这些值的方式与打印它们的方式之间是有区别的。
使用JsonSmartJsonProvider
此行...
JsonPath.read(parse, "$.phoneNumbers");
...返回一个JSONArray
和toString()
方法-当您“打印” JSONArray
实例时就足够聪明,以至于知道它正在处理JSON,因此它将状态打印为JSON字符串。 例如:
[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}]
但是,当您使用JacksonJsonProvider
此行...
JsonPath.read(parse, "$.phoneNumbers");
...返回LinkedHashMap
的List
,以及当您“打印”该实例不支持JSON时调用的toString()
实现,因此将打印以下内容:
[{type=home, number=212 555-1234}, {type=office, number=646 555-4567}]
如果要在使用JacksonJsonProvider
时打印JSON,则必须使用支持JSON的内容进行打印。 这是一个例子:
String payload = "{\n" +
" \"firstName\": \"John\",\n" +
" \"lastName\": \"Smith\",\n" +
" \"isAlive\": true,\n" +
" \"age\": 25,\n" +
" \"height_cm\": 167.6,\n" +
" \"address\": {\n" +
" \"streetAddress\": \"21 2nd Street\",\n" +
" \"city\": \"New York\",\n" +
" \"state\": \"NY\",\n" +
" \"postalCode\": \"10021-3100\"\n" +
" },\n" +
" \"phoneNumbers\": [\n" +
" {\n" +
" \"type\": \"home\",\n" +
" \"number\": \"212 555-1234\"\n" +
" },\n" +
" {\n" +
" \"type\": \"office\",\n" +
" \"number\": \"646 555-4567\"\n" +
" }\n" +
" ],\n" +
" \"children\": [],\n" +
" \"spouse\": null\n" +
"}";
// this is a simpler way of declaring and using the JacksonJsonProvider
ObjectMapper objectMapper = new ObjectMapper();
Configuration conf = Configuration.builder()
.jsonProvider(new JacksonJsonProvider(objectMapper))
.build();
Object obj = JsonPath.using(conf).parse(payload).read("$.phoneNumbers");
// prints out:
// [{type=home, number=212 555-1234}, {type=office, number=646 555-4567}]
System.out.println(obj);
// prints out:
// [{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}]
System.out.println(objectMapper.writer().writeValueAsString(obj));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.