简体   繁体   English

Jsonpath 与 Jackson 或 Gson

[英]Jsonpath with Jackson or Gson

I am getting a big json document and i want to parse only some part of it to my java classes.我得到了一个很大的 json 文档,我只想将其中的一部分解析为我的 java 类。 I was thinking to use something like jsonpath to extract partial data from it instead of creating entire hierarchy of java classes.我正在考虑使用类似 jsonpath 的东西从中提取部分数据,而不是创建 Java 类的整个层次结构。

Does Jackson or Gson support jsonpath in any way? Jackson 或 Gson 是否以任何方式支持 jsonpath? If yes, can you please provide me some examples or point to another standard library for this purpose?如果是,您能否为此目的提供一些示例或指向另一个标准库?

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
}

The Jayway JsonPath library 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 Jackson:您还可以将 JSON 对象直接映射到类,例如在 GSON 或 Jackson 中:

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 Jackson to do the deserialization (the default is to use json-smart), you can also configure this:如果你想专门使用GSON或者Jackson来做反序列化(默认使用json-smart),你也可以这样配置:

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);
    }
});

See the documentation for more details.有关更多详细信息,请参阅文档

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-jackson-and-json-pointer-to-query-and-parse-an-arbitrary-json-node/这是我在这里找到的JSON Pointer方法: https : //cassiomolin.com/2016/07/13/using-jackson-and-json-pointer-to-query-and-parse-an-arbitrary-json-node /

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM