Java Jsonpath 与 Jackson 或 Gson
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/34111276/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Jsonpath with Hymanson or Gson
提问by suraj bahl
I am getting a big json document and i want to parse only some part of it to my java classes. I was thinking to use something like jsonpath to extract partial data from it instead of creating entire hierarchy of java classes.
我得到了一个很大的 json 文档,我只想将其中的一部分解析为我的 java 类。我正在考虑使用类似 jsonpath 的东西从中提取部分数据,而不是创建 Java 类的整个层次结构。
Does Hymanson or Gson support jsonpath in any way? If yes, can you please provide me some examples or point to another standard library for this purpose?
Hymanson 或 Gson 是否以任何方式支持 jsonpath?如果是,您能否为此目的提供一些示例或指向另一个标准库?
For example lets say i have a below document and i want to extract only below data from it in my java classes:
例如,假设我有一个以下文档,并且我只想在我的 Java 类中从中提取以下数据:
$.store.book[0] - Only first book $.store.bicycle.price - price of bicycle
$.store.book[0] - 仅第一本书 $.store.bicycle.price - 自行车的价格
{
"store": {
"book": [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
},
"expensive": 10
}
采纳答案by andersschuller
The Jayway JsonPathlibrary has support for reading values using a JSON path.
该Jayway JsonPath图书馆阅读使用JSON路径值的支持。
For example:
例如:
String json = "...";
Map<String, Object> book = JsonPath.read(json, "$.store.book[0]");
System.out.println(book); // prints {category=reference, author=Nigel Rees, title=Sayings of the Century, price=8.95}
Double price = JsonPath.read(json, "$.store.bicycle.price");
System.out.println(price); // prints 19.95
You can also map JSON objects directly to classes, like in GSON or Hymanson:
您还可以将 JSON 对象直接映射到类,例如在 GSON 或 Hymanson 中:
Book book = JsonPath.parse(json).read("$.store.book[0]", Book.class);
System.out.println(book); // prints Book{category='reference', author='Nigel Rees', title='Sayings of the Century', price=8.95}
If you would like to specifically use GSON or Hymanson to do the deserialization (the default is to use json-smart), you can also configure this:
如果你想专门使用GSON或者Hymanson来做反序列化(默认使用json-smart),你也可以这样配置:
Configuration.setDefaults(new Configuration.Defaults() {
private final JsonProvider jsonProvider = new HymansonJsonProvider();
private final MappingProvider mappingProvider = new HymansonMappingProvider();
@Override
public JsonProvider jsonProvider() {
return jsonProvider;
}
@Override
public MappingProvider mappingProvider() {
return mappingProvider;
}
@Override
public Set<Option> options() {
return EnumSet.noneOf(Option.class);
}
});
See the documentationfor more details.
有关更多详细信息,请参阅文档。
回答by Ashley Frieze
String json = "{\"firstName\":\"John\",\"lastName\":\"Doe\",\"address\":{\"street\":"
+ "\"21 2nd Street\",\"city\":\"New York\",\"postalCode\":\"10021-3100\","
+ "\"coordinates\":{\"latitude\":40.7250387,\"longitude\":-73.9932568}}}";
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(json);
JsonNode coordinatesNode = node.at("/address/coordinates");
This is a JSON Pointer
approach which I found here: https://cassiomolin.com/2016/07/13/using-Hymanson-and-json-pointer-to-query-and-parse-an-arbitrary-json-node/
这是JSON Pointer
我在这里找到的一种方法:https: //cassiomolin.com/2016/07/13/using-Hymanson-and-json-pointer-to-query-and-parse-an-arbitrary-json-node/