JsonPath:将JSON解析为具有列表成员的Java对象

JsonPath:将JSON解析为具有列表成员的Java对象,java,json,jsonpath,Java,Json,Jsonpath,我正在尝试将以下JSON解析为Book类: { "inventory": { "book": { "title": "Database Systems", "authors": [ {"name": "Sudarshan"}, {"name": "Korth"}, {"name": "Silberschatz"} ] }

我正在尝试将以下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...

}
这将导致以下异常:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.example.books.Book
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)
我也尝试过:

Book book = JsonPath.parse(inventoryJson.toString()).read("$.inventory.book", Book.class);
这一条现在给出了一个不同的例外:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.example.books.Book
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)
我如何让它工作

原始类:



完整堆栈跟踪:
我从您的问题中发现了一系列代码错误

让我们从json本身开始:在您提供的视图中,它的格式并不正确

应该是:

{
"inventory": {
    "books": {
        "title": "Database Systems",
        "authors": [
            {"name": "Sudarshan"},
            {"name": "Korth"},
            {"name": "Silberschatz"}
         ]
     }
 }
}
还请注意,它应该是“图书”,而不是“图书”

下一个问题是您已经将类
Book
Author
声明为包本地。这行不通。请考虑将它们定义为<代码>公共<代码>或<代码>公共静态< /代码>。

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


Book Book=JsonPath.parse(inventoryJson.toString()).read(“$.inventory.books”,Book.class)-应该可以正常工作。

我从您的问题中发现了一系列代码错误

让我们从json本身开始:在您提供的视图中,它的格式并不正确

应该是:

{
"inventory": {
    "books": {
        "title": "Database Systems",
        "authors": [
            {"name": "Sudarshan"},
            {"name": "Korth"},
            {"name": "Silberschatz"}
         ]
     }
 }
}
还请注意,它应该是“图书”,而不是“图书”

下一个问题是您已经将类
Book
Author
声明为包本地。这行不通。请考虑将它们定义为<代码>公共<代码>或<代码>公共静态< /代码>。

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


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

很抱歉出错。我只是创建这些虚拟类来模仿我拥有的原始类,并指出收到的异常。我已经修改了问题,但仍然不起作用。1)您没有修复
JSON
。2) 不清楚,您是否将类声明为顶级类?3) 它应该可以工作-我已经用我的修复程序进行了测试。为代码添加了pastebin链接,以及完整的异常stacktrace。它仍然有“books”作为键(忘了更改)。books,而不是book,你看到区别了吗?Pastebin链接与“books”一致。我是不是漏掉了什么?对不起,我错了。我只是创建这些虚拟类来模仿我拥有的原始类,并指出收到的异常。我已经修改了问题,但仍然不起作用。1)您没有修复
JSON
。2) 不清楚,您是否将类声明为顶级类?3) 它应该可以工作-我已经用我的修复程序进行了测试。为代码添加了pastebin链接,以及完整的异常stacktrace。它仍然有“books”作为键(忘了更改)。books,而不是book,你看到区别了吗?Pastebin链接与“books”一致。我是不是遗漏了什么?