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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 15:19:54  来源:igfitidea点击:

Jsonpath with Hymanson or Gson

javajsonHymansongson

提问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 Pointerapproach 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/