web-dev-qa-db-fra.com

Jsonpath avec Jackson ou Gson

Je reçois un gros document json et je veux en analyser seulement une partie dans mes classes Java. Je pensais utiliser quelque chose comme jsonpath pour en extraire des données partielles au lieu de créer une hiérarchie entière des classes Java.

Jackson ou Gson prend-il en charge jsonpath d'une manière ou d'une autre? Si oui, pouvez-vous me fournir quelques exemples ou indiquer une autre bibliothèque standard à cet effet?

Par exemple, disons que j'ai un document ci-dessous et que je veux en extraire uniquement les données ci-dessous dans mes classes Java:

$ .store.book [0] - Seul premier livre $ .store.bicycle.price - prix du vélo

{
    "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
}
16
suraj bahl

La bibliothèque Jayway JsonPath prend en charge la lecture de valeurs à l'aide d'un chemin JSON.

Par exemple:

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

Vous pouvez également mapper des objets JSON directement sur des classes, comme dans GSON ou 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}

Si vous souhaitez utiliser spécifiquement GSON ou Jackson pour effectuer la désérialisation (la valeur par défaut est d'utiliser json-smart), vous pouvez également configurer ceci:

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

Voir la documentation pour plus de détails.

19
andersschuller