使用gson将嵌套Java对象转换为json或从json转换为Java对象
假设我们有以下两个Java类(省略其他类成员): 此外,假设我们有以下json对象:使用gson将嵌套Java对象转换为json或从json转换为Java对象,java,json,gson,Java,Json,Gson,假设我们有以下两个Java类(省略其他类成员): 此外,假设我们有以下json对象: {"Book": { "name": "Bible", "price": 20, "tags": ["God", "Religion"], "writer": { "name": "Jesus" } } 我正试图找到将JavaBook实例转换为json并使用gson返回的最佳方法。为了使示例更有趣,请注意,在json中,我想使用“writer”而不是“A
{"Book": {
"name": "Bible",
"price": 20,
"tags": ["God", "Religion"],
"writer": {
"name": "Jesus"
}
}
我正试图找到将JavaBook实例转换为json并使用gson返回的最佳方法。为了使示例更有趣,请注意,在json中,我想使用“writer”而不是“Author”。你能帮忙吗?理想情况下,我希望看到一个完整的实现 尝试将Gson配置为输出适合页面打印的Json。此选项仅影响Json序列化
阅读更多关于通常通过首先构造Gson实例,然后在其上调用下面的方法来使用的方法的信息
- 将指定对象序列化为其等效Json表示形式
- 将指定的Json反序列化为指定类的对象
BookDetails对象到JSON字符串 示例代码:
Book book = new Book();
book.setName("Bible");
book.setTags(new String[] { "God", "Religion" });
book.setPrice(20);
Author author = new Author();
author.setName("Jesus");
book.setWriter(author);
BookDetails bookDetails = new BookDetails();
bookDetails.setBook(book);
String jsonString = new Gson().toJson(bookDetails);
// JOSN with pretty printing
// String jsonString = new GsonBuilder().setPrettyPrinting().create().toJson(bookDetails);
System.out.println(jsonString);
输出:
{"Book":{"name":"Bible","tags":["God","Religion"],"price":20,"writer":{"name":"Jesus"}}}
BookDetails对象的JSON字符串
这是课程
class BookDetails {
private Book Book;
// getter & setter
}
class Book {
private String name;
private String[] tags;
private int price;
// Variable name should be writer instead of author as mapped to JSON string
private Author writer;
// getter & setter
}
class Author {
private String name;
// getter & setter
}
谢谢你的回答。我能够找到它,并使用一些自定义序列化程序和反序列化程序实现它。以下是我自己的解决方案:
public class JsonTranslator {
private static Gson gson = null;
public void test(Book book1) {
JsonElement je = gson.toJson(book1); // convert book1 to json
Book book2 = gson.fromJson(je, Book.class); // convert json to book2
// book1 and book2 should be equivalent
}
public JsonTranslator() {
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Book.class, new BookTrnaslator());
builder.registerTypeAdapter(Author.class, new AuthorTrnaslator());
builder.setPrettyPrinting();
gson = builder.create();
}
private class BookTrnaslator implements JsonDeserializer<Book>, JsonSerializer<Book> {
public Card deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject jobj = json.getAsJsonObject();
Book book = new Book();
book.setName(jobj.get("name").getAsString());
book.setTags(jobj.get("tags").getAsJsonArray()); //Assuming setTags(JsonArray ja) exists
book.setName(jobj.get("price").getAsInt());
book.setAuthor(gson.fromJson(jobj.get("writer"), Author.class));
return book;
}
public JsonElement serialize(Book src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject jobj = new JsonObject();
jobj.addProperty("name", src.getName());
jobj.add("tags", src.getTagsAsJsonArray());
jobj.addProperty("price", src.getPrice());
jobj.add("writer", gson.toJson(src.getAuthor()));
return jobj;
}
}
private class AuthorTrnaslator implements JsonDeserializer<Author>, JsonSerializer<Author> {
public Card deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject jobj = json.getAsJsonObject();
Author author = new Author();
author.setName(jobj.get("name").getAsString());
return author;
}
public JsonElement serialize(Author src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject jobj = new JsonObject();
jobj.addProperty("name", src.getName());
return jobj;
}
}
}
公共类JsonTranslator{
私有静态Gson Gson=null;
公共无效测试(第1册){
JsonElement je=gson.toJson(book1);//将book1转换为json
bookbook2=gson.fromJson(je,Book.class);//将json转换为book2
//第1册和第2册应等同
}
公共JsonTranslator(){
GsonBuilder=新的GsonBuilder();
registerTypeAdapter(Book.class,new BookTrnaslator());
registerTypeAdapter(Author.class,new AuthorTrnaslator());
setPrettyPrinting();
gson=builder.create();
}
私有类BookTrnaslator实现JsonDeserializer、JsonSerializer{
公共卡反序列化(JsonElement json,类型typeOfT,JsonDeserializationContext)引发JsonParseException{
JsonObject jobj=json.getAsJsonObject();
书=新书();
book.setName(jobj.get(“name”).getAsString());
book.setTags(jobj.get(“tags”).getAsJsonArray();//假设setTags(JsonArray ja)存在
book.setName(jobj.get(“price”).getAsInt();
setAuthor(gson.fromJson(jobj.get(“writer”)、Author.class));
还书;
}
公共JsonElement序列化(Book src,Type typeOfSrc,JsonSerializationContext){
JsonObject jobj=新的JsonObject();
jobj.addProperty(“name”,src.getName());
add(“tags”,src.getTagsAsJsonArray());
jobj.addProperty(“price”,src.getPrice());
add(“writer”,gson.toJson(src.getAuthor());
返回jobj;
}
}
私有类AuthorTrnaslator实现JsonSerializer、JsonSerializer{
公共卡反序列化(JsonElement json,类型typeOfT,JsonDeserializationContext)引发JsonParseException{
JsonObject jobj=json.getAsJsonObject();
作者=新作者();
author.setName(jobj.get(“name”).getAsString());
返回作者;
}
公共JsonElement序列化(作者src,类型typeOfSrc,JsonSerializationContext){
JsonObject jobj=新的JsonObject();
jobj.addProperty(“name”,src.getName());
返回jobj;
}
}
}
我们可以看看您在这方面的一些努力吗?理想情况下,我们不想为您做家庭作业。如果你在谷歌上搜索一下,你会发现很多关于如何使用gson的示例实现。我已经熟悉gson以及如何手动将对象转换为json或从json转换为json,这对于大型Java对象来说是一项繁琐的任务。我主要是通过配置gson来实现自动化(特别是对于fromJson)。我上面发布的示例是人为的,但它包含了我自己编写代码所需的所有知识。我的主要问题是如何配置gson,使其知道“writer”键的值应该转换为Author类的实例。我不知道该怎么做。谢谢。只有两个简单的问题:为什么需要实现BookDetails?那么,如何让gson将json对象中“writer”的值映射到Author类的实例,反之亦然?所有POJO类都应该具有json字符串中所示的相同副本。变量的名称必须区分大小写。阅读在这里,您已经创建了一个类型为Author
的变量writer
,Gson从字段中读取并将name
的值分配给Author
的name
变量。这里使用BookDetails
的方式与创建变量的方式相同,该变量表示JSON字符串的初始Book
值,并以与Author
相同的方式进行映射代码>而不是作者
从JSON字符串映射writer
。如果问题得到解决,请不要忘记关闭线程。您已经问了7个问题,但没有一个是关闭的?
class BookDetails {
private Book Book;
// getter & setter
}
class Book {
private String name;
private String[] tags;
private int price;
// Variable name should be writer instead of author as mapped to JSON string
private Author writer;
// getter & setter
}
class Author {
private String name;
// getter & setter
}
public class JsonTranslator {
private static Gson gson = null;
public void test(Book book1) {
JsonElement je = gson.toJson(book1); // convert book1 to json
Book book2 = gson.fromJson(je, Book.class); // convert json to book2
// book1 and book2 should be equivalent
}
public JsonTranslator() {
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Book.class, new BookTrnaslator());
builder.registerTypeAdapter(Author.class, new AuthorTrnaslator());
builder.setPrettyPrinting();
gson = builder.create();
}
private class BookTrnaslator implements JsonDeserializer<Book>, JsonSerializer<Book> {
public Card deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject jobj = json.getAsJsonObject();
Book book = new Book();
book.setName(jobj.get("name").getAsString());
book.setTags(jobj.get("tags").getAsJsonArray()); //Assuming setTags(JsonArray ja) exists
book.setName(jobj.get("price").getAsInt());
book.setAuthor(gson.fromJson(jobj.get("writer"), Author.class));
return book;
}
public JsonElement serialize(Book src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject jobj = new JsonObject();
jobj.addProperty("name", src.getName());
jobj.add("tags", src.getTagsAsJsonArray());
jobj.addProperty("price", src.getPrice());
jobj.add("writer", gson.toJson(src.getAuthor()));
return jobj;
}
}
private class AuthorTrnaslator implements JsonDeserializer<Author>, JsonSerializer<Author> {
public Card deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject jobj = json.getAsJsonObject();
Author author = new Author();
author.setName(jobj.get("name").getAsString());
return author;
}
public JsonElement serialize(Author src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject jobj = new JsonObject();
jobj.addProperty("name", src.getName());
return jobj;
}
}
}