[英]JsonPath: Parsing JSON into a Java object with List member
我試圖將以下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
實現此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
我在你的問題代碼中發現了一系列錯誤。
讓我們從json本身開始:它在你所提供的那個視圖中並不完美。
它應該是:
{
"inventory": {
"books": {
"title": "Database Systems",
"authors": [
{"name": "Sudarshan"},
{"name": "Korth"},
{"name": "Silberschatz"}
]
}
}
}
另請注意,它應該是“ 書籍 ”而不是“ 書 ”。
接下來的問題是您已將類Book
和Author
聲明為包本地。 這不行。 至少考慮將它們public
或public static
。
這些修復將解決您的問題,第二個聲明:
Book book = JsonPath.parse(inventoryJson.toString()).read("$.inventory.books", Book.class);
- 它應該正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.