【问题标题】:Object serialization to json, certain fields only对象序列化为 json,仅限某些字段
【发布时间】:2017-10-06 10:43:11
【问题描述】:

我有一个大的嵌套对象。我想在 JSON 字符串中序列化这个对象,但是我只需要包含某些字段。这里的问题是字段可能会非常频繁地更改,我想以一种可以帮助我轻松包含或排除字段以进行序列化的方式构建它。

我知道我可以编写大量代码来提取某些字段并“手动”构建 JSON。但我想知道是否有任何其他优雅的方式来实现类似的结果,但指定必填字段列表?

例如具有以下对象结构,我希望在响应中仅包含 idname

class Building {
    private List<Flat> flats;
}

class Flat {
    private Integer id;     
    private Person owner;
}


class Person {
    private String name;
    private String surname;
}

json:

{
    "flats" : [
        {
            "flat":
            {
                "id" : "1",
                "person" : {
                    "name" : "John"
                }
            }
        }
    ]
}

【问题讨论】:

    标签: java json serialization


    【解决方案1】:

    您可以使用gson 序列化/反序列化JSON。 然后您可以包含 @Expose 注释以仅使用您需要的字段。

    请务必将您的 Gson 对象配置为仅序列化“公开”字段。

    Gson gson = GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
    

    替代方案:

    您实际上可以以相反的方式执行此操作,标记不会公开的字段。您可以使用 transient 关键字来执行此操作。 因此,无论您想忽略什么,只需添加 transient 即可。以下是它在 gson 上的工作原理。

    PS:这也适用于大多数 Java JSON 序列化程序。

    【讨论】:

    • 听起来不错,我会试试的!如果我将整个私有 Person 所有者字段标记为 @Expose,它是否也会自动包含所有嵌套字段?
    • 实际上,如果您希望它们被序列化,您必须使用@Expose 注释标记所有字段。我用替代方法编辑了答案,也阅读了它,也许这更适合你。
    【解决方案2】:

    使用com.fasterxml.jackson.annotation.JsonIgnore 是实现此目的的另一种方法。

    import com.fasterxml.jackson.annotation.JsonIgnore;
    
    class Person {
        private String name;
        @JsonIgnore
        private String surname;
    }
    

    当解析器将 bean 转换为 json 时,它将忽略 surname。 类似的注解将在其他 json 处理库中可用。

    【讨论】:

      【解决方案3】:

      如果使用 Gson,请研究如何使用 ExclusionStrategy & JsonSerializer。

      使用这些是一种更灵活的方式来控制序列化,因为它允许决定每个序列化要序列化的内容。

      如果需要更改要序列化的内容,使用注释需要稍后从字段中添加/删除这些注释。

      在你的例子中,后者可能更合适。

      这个问题可能是一个很好的起点 serialize-java-object-with-gson

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-24
        • 1970-01-01
        相关资源
        最近更新 更多