Подтвердить что ты не робот

Jsonpath с Джексоном или Гсоном

Я получаю большой json-документ, и я хочу разобрать только часть его на классы java. Я думал использовать что-то вроде jsonpath для извлечения частичных данных из него вместо создания цельной иерархии классов Java.

Поддерживает ли Jackson или Gson jsonpath каким-либо образом? Если да, можете ли вы предоставить мне несколько примеров или указать для этой цели другую стандартную библиотеку?

Например, скажем, у меня есть нижний документ, и я хочу извлечь только данные из него в мои классы Java:

$. 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
}
4b9b3361

Ответ 1

Библиотека Jayway JsonPath поддерживает чтение значений с использованием пути JSON.

Например:

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

Вы также можете сопоставить объекты 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}

Если вы хотите специально использовать 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);
    }
});

Подробнее см. документацию.