[英]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.