使用gson将嵌套Java对象转换为json或从json转换为Java对象

使用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

假设我们有以下两个Java类(省略其他类成员):

此外,假设我们有以下json对象:

{"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;
       }
    }
}