参考父对象反序列化使用GSON
问题描述:
考虑下面的JSON一个JSON:参考父对象反序列化使用GSON
{
"authors": [{
"name": "Stephen King",
"books": [{
"title": "Carrie"
}, {
"title": "The Shining"
}, {
"title": "Christine"
}, {
"title": "Pet Sematary"
}]
}]
}
这个对象结构:
public class Author {
private List<Book> books;
private String name;
}
public class Book {
private transient Author author;
private String title;
}
有没有一种方法,使用谷歌的Java库GSON,反序列化JSON并且书籍对象具有对“父”作者对象的引用?
是否有可能使用自定义解串器的而不使用?
- 如果是:如何?
- 如果否:是否仍然可以使用自定义解串器来做到这一点?
答
在这种情况下,我将实现父对象的自定义JsonDeserializer
,并传播Author
信息,像这样:
public class AuthorDeserializer implements JsonDeserializer<Author> {
@Override
public Author deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
final JsonObject authorObject = json.getAsJsonObject();
Author author = new Author();
author.name = authorObject.get("name").getAsString();
Type booksListType = new TypeToken<List<Book>>(){}.getType();
author.books = context.deserialize(authorObject.get("books"), booksListType);
for(Book book : author.books) {
book.author = author;
}
return author;
}
}
请注意,我的例子中省略了错误检查。你会使用它,像这样:
Gson gson = new GsonBuilder()
.registerTypeAdapter(Author.class, new AuthorDeserializer())
.create();
要显示它的工作,我脱下只是“作者”从你的例子关键JSON,让我做到这一点:
JsonElement authorsJson = new JsonParser().parse(json).getAsJsonObject().get("authors");
Type authorList = new TypeToken<List<Author>>(){}.getType();
List<Author> authors = gson.fromJson(authorsJson, authorList);
for(Author a : authors) {
System.out.println(a.name);
for(Book b : a.books) {
System.out.println("\t " + b.title + " by " + b.author.name);
}
}
打印了:
Stephen King
Carrie by Stephen King
The Shining by Stephen King
Christine by Stephen King
Pet Sematary by Stephen King
'有没有可能不使用自定义解串器? “我不认为这是可能的,因为性质如何反序列化。 '是否仍然可以用定制的解串器来做到这一点?'是的,有可能这样做。只需查找有关该部分的教程,stackoverflow就此主题提供了几个问题和答案。 –
@Tezla你能指点我一篇文章或一个解释我如何实现这一点的stackoverflow,因为我没有找到任何东西。这就是为什么我决定发布我的问题。它会帮助我很多。 – Thermech