JsonPath:使用List成员将JSON解析为Java对象

时间:2017-02-28 14:24:56

标签: java json jsonpath

我正在尝试将以下JSON解析为Book类:

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

Book类,其中包含字段的JSON注释,并具有以下定义:

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...

}

我正在尝试使用com.jayway.jsonpath.JsonPath实现此目的:

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

这会导致以下异常:

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

我也尝试过:

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

这个现在给出了一个不同的例外:

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)

如何让它发挥作用?

原班级:
    http://pastebin.com/SAhipfxL
    http://pastebin.com/vWfWsaqN
    http://pastebin.com/7tqhJfw3

完成堆栈跟踪:     http://pastebin.com/QWV89Hgj

1 个答案:

答案 0 :(得分:0)

我在你的问题的代码中发现了一系列错误。

让我们从json本身开始:它在你所提供的视图中并不完美。

应该是:

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

另请注意,它应该是&#34; 书籍&#34;而不是&#34; 预订&#34;。

下一个问题是您已将类BookAuthor声明为包本地。这不会奏效。请至少考虑publicpublic static

这些修复将解决您的问题,第二个声明:

Book book = JsonPath.parse(inventoryJson.toString()).read("$.inventory.books", Book.class); - 它应该正常工作。