java - GSON:反序列化时删除不必要的父对象

标签 java gson json-deserialization

我正在尝试使用 GSON 反序列化 JSON 数组。我所有的嵌套对象都嵌入到一个“嵌入式”对象中。

{
    "Book": {
        "name": "Book 1",
        "published": 1999,
        "links": {
          "url": "www.book1.com"
        },
        "embedded": {
            "Author": {
                "name": "John Doe",
                "links": {
                    "url": "www.johndoe.com"
                }
            }
        }
    }
}

我也可能遇到这样的情况:

{
    "Book": {
        "name": "Book 1",
        "published": 1999,
        "links": {
          "url": "www.book1.com"
        },
        "embedded": {
            "Publisher": {
                "name": "Publishing Company",
                "links": {
                    "url": "www.publishingcompany.com"
                }
            }
        }
    }
}

这是一个极其简单的例子。我的一些对象可能嵌套了 2 或 3 层深,并且都在一个“嵌入”对象中。此外,每个对象在“链接”对象中都有一个嵌套的“url”。我有大约 20 个不同的模型对象,每个对象都有几个字段,每个对象都有“嵌入式”对象。我开始为每个模型编写自定义反序列化器,但这似乎忽略了使用 gson 的全部要点,而且我可能并不总是知道嵌入对象是什么。

我找到了这个 answer ,但它用于序列化对象。一段时间以来,我一直在努力解决这个问题,但没有找到任何可行的方法。

我的 Book 模型如下所示:

public class Book {
    String name;
    int published;
    String url;
    Author author;
    Publisher publisher;
}

作者类:

public class Author {
    String name;
    String url;
}

发布者类:

public class Publisher {
    String name;
    String url;
}

到目前为止,这是我的 Book 反序列化器:

public class BookDeserializer implements JsonDeserializer<Book> {
    @Override
    public Book deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {

        final JsonObject jsonObject = json.getAsJsonObject();

        Book book = new Book();
        book.setName(jsonObject.get("name").getAsString());
        book.setPublished(jsonObject.get("published").getAsInt());
        String url = jsonObject.getAsJsonObject("links").get("url").getAsString();
        book.setUrl(url);

        // 1) How to get rid of this and skip to the "real" nested object?
        final JsonObject embeddedObject = jsonObject.getAsJsonObject("embedded");

        // 2) See what the "embedded" object actually is.
        String embeddedModel;
        Set<Map.Entry<String, JsonElement>> entrySet = embeddedObject.entrySet();
        for (Map.Entry<String, JsonElement> entry : entrySet) {

            // Author or Publisher
            embeddedModel = entry.getKey();
        }

        // We have the model's key, now add code here to deserialize whatever the object is

        return book;
    }
}

我仍然需要解析 json 并为 Book 设置每个字段。然后,我将不得不添加代码以确定并为嵌套对象使用正确的反序列化器。看起来我仍然需要为每个对象定制一个反序列化器来获取“url”。我是 gson 的新手,所以也许我忽略了一些东西,但似乎我还不如手动解析所有 json,甚至不使用 gson。也许有一种方法可以扁平化 json?

关于如何解析它并仍然使用 gson 的便利性的任何想法,或者这甚至可能吗?也许 jackson 可以更好地处理这件事?

最佳答案

创建一个名为 embedded 的类并将其添加为 Book 中的一个字段:

public class Book {
    String name;
    int published;
    Embedded embedded;
}

然后创建一个嵌入式类:

public class Embedded {
    Author Author;
    Publisher Publisher;
}

按照您的 JSON 为您的类建模

关于java - GSON:反序列化时删除不必要的父对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28133500/

相关文章:

java - Criteria 正确生成 SQL 查询,但不返回任何内容

java - 基于数据库数据的树结构+更快的树操作

java - Android Retrofit 我没有收到 JSON

带有变量标签的 C# JSON - 没有为 'System.String' 类型定义无参数构造函数

c# - JSON Newtonsoft C# 反序列化不同类型对象的列表

java - 用文本文件存储和显示多个用户的信息

java - 使用三元运算符将字符串转换为整数

java - 使用assertEquals 和“比较失败”窗口时如何显示对象字段而不是引用

java - 在没有模型的情况下使用 GSON 解析 JSON

c# - Newtonsoft TypeNameHandling.all 具有基本命名空间检查安全吗?