2017-02-28 1 views
1

Je suis en train d'analyser les éléments suivants JSON en classe livre:JsonPath: Parsing JSON dans un objet Java avec Liste des membres

{ 
    "inventory": { 
     "book": { 
      "title": "Database Systems", 
      "authors": [ 
       {"name": "Sudarshan"}, 
       {"name": "Korth"}, 
       {"name": "Silberschatz"} 
      ] 
     } 
    } 
} 

classe du livre qui a annotations JSON pour les champs et a la définition suivante:

package com.example.books  

public class Book { 

    @JsonProperty("title") 
    private String title; 

    @JsonProperty("authors") 
    private List<Author> authors; 

    public Book() { 
     authors = new ArrayList<Author>(); 
    } 
    // constructors, getters, setters 

}  

public class Author { 
    @JsonProperty 
    private String name; 

    // constructor, getters, setters... 

} 

Je suis en train de réaliser cela en utilisant com.jayway.jsonpath.JsonPath:

Book book = JsonPath.read(inventoryJson.toString(), "$.inventory.book"); 

Il en résulte l'exception suivante:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.example.books.Book 

J'ai aussi essayé:

Book book = JsonPath.parse(inventoryJson.toString()).read("$.inventory.book", Book.class); 

Celui-ci donne maintenant une autre exception:

java.lang.RuntimeException: Can not find Array 'authors' field in class com.example.book.Book 
    at net.minidev.json.writer.BeansMapper$Bean.startArray(BeansMapper.java:79) 
    at net.minidev.json.parser.JSONParserBase.readMain(JSONParserBase.java:402) 
    at net.minidev.json.parser.JSONParserBase.readObject(JSONParserBase.java:542) 
    at net.minidev.json.parser.JSONParserBase.readFirst(JSONParserBase.java:297) 
    at net.minidev.json.parser.JSONParserBase.parse(JSONParserBase.java:154) 
    at net.minidev.json.parser.JSONParserString.parse(JSONParserString.java:58) 
    at net.minidev.json.parser.JSONParser.parse(JSONParser.java:263) 
    at net.minidev.json.JSONValue.parse(JSONValue.java:206) 
    at com.jayway.jsonpath.spi.mapper.JsonSmartMappingProvider.map(JsonSmartMappingProvider.java:82) 
    at com.jayway.jsonpath.internal.JsonContext.convert(JsonContext.java:192) 
    at com.jayway.jsonpath.internal.JsonContext.read(JsonContext.java:158) 

Comment puis-je faire fonctionner?

cours Original:
http://pastebin.com/SAhipfxL
http://pastebin.com/vWfWsaqN
http://pastebin.com/7tqhJfw3

trace complète de la pile: http://pastebin.com/QWV89Hgj

Répondre

0

J'ai trouvé série d'erreurs dans le code de votre question. Commençons par json lui-même: il n'est pas bien formé dans exactement cette vue, que vous avez fournie.

Il devrait être:

{ 
"inventory": { 
    "books": { 
     "title": "Database Systems", 
     "authors": [ 
      {"name": "Sudarshan"}, 
      {"name": "Korth"}, 
      {"name": "Silberschatz"} 
     ] 
    } 
} 
} 

Notez également s'il vous plaît, qu'il devrait être "livres" au lieu de "livre".

Le problème suivant est que vous avez déclaré les classes Book et Author en tant que package local. Cela ne marchera pas. Envisager de les faire public ou public static au moins.

Ces correctifs vont résoudre votre problème, pour la deuxième déclaration:

Book book = JsonPath.parse(inventoryJson.toString()).read("$.inventory.books", Book.class); - il devrait fonctionner correctement.

+0

Désolé pour les erreurs. Je viens de créer ces classes factices pour imiter les classes d'origine et souligner les exceptions reçues. J'ai édité la question avec des corrections et ça ne marche toujours pas. – user87407

+0

1) Vous n'avez pas corrigé 'JSON'. 2) Ce n'est pas clair, avez-vous déclaré des classes comme des classes supérieures ou non? 3) Ca ** devrait ** fonctionner - J'ai testé avec mes correctifs. – Andremoniy

+0

Ajout de liens pastebin pour le code, avec l'exception complète stacktrace. Il a toujours des "livres" comme clé (j'ai oublié de changer cela). – user87407