【问题标题】:Gson: enum serialization issue in beanGson:bean中的枚举序列化问题
【发布时间】:2017-04-28 07:40:01
【问题描述】:

我的 SegmentCreateRequest bean 类:

public class SegmentCreateRequest {

    @SerializedName("name")
    private String segmentName;

    private SegmentSource segmentSource;

    public String getSegmentName() {
        return segmentName;
    }

    public void setSegmentName(String segmentName) {
        this.segmentName = segmentName;
    }

    public SegmentSource getSegmentSource() {
        return segmentSource;
    }

    public void setSegmentSource(SegmentSource segmentSource) {
        this.segmentSource = segmentSource;
    }

    public enum SegmentSource {

        @SerializedName("followed") FOLLOWED,
        @SerializedName("impressed") IMPRESSED,
        @SerializedName("engaged") ENGAGED,
        @SerializedName("tailored") TAILORED;

        @SerializedName("user_ids")
        private List<String> userIds;

        SegmentSource(){
            this.userIds = Lists.newArrayList();
        }

        public void setUserIds(List<String> userIds) {
            this.userIds = userIds;
        }

        public List<String> getUserIds() {
            return this.userIds;
        }

        public SegmentSource userIds(List<String> userIds) {
            this.userIds = userIds;
            return this;
        }
    }
}

segmentSource 字段名称应根据枚举值更改。

我期待此类的对象序列化返回如下内容:

{
 "name":"segment101",
 "followed":{"user_ids":["1234567890"]}
}

但是,它返回:

{"name":"skumar-3020-seg","segmentSource":"followed"}

使用 Google Gson 进行序列化/反序列化。

如何设置我的 bean 以实现所需的序列化?

【问题讨论】:

  • 感谢采纳;很高兴我的回答对您有所帮助。

标签: java serialization enums gson


【解决方案1】:

您正在将枚举实例序列化为名为 segmentSource字段

该字段的名称是不是名称!

除此之外,您的代码中还有一个潜在的错误:枚举是单例!例如,将有 一个 的 FOLLOWED 实例。这意味着:对 FOLLOWED 列表的任何更改都是“全局”可见的。没有 两个 不同的 SegmentCreateRequest 然后(并行)这样的事情。

换句话说:当你创建一些

SegmentCreateRequests reqA = ... 

在 FOLLOWED 上有一些特定的用户;但你会的

SegmentCreateRequests reqB = ... 

并行,那么这两个请求对象最终将在 same 列表上工作。含义:您的代码不是线程安全的。因此:用户列表不能进入枚举常量。它应该是周围请求的属性!

【讨论】:

  • 除此之外,Gson 不支持@SerializedName 用于这种情况的枚举(我认为它永远不应该,但是我发现以下问题很奇怪:github.com/google/gson/issues/1011)。也不支持动态名称(FieldNamingStrategy 不提供实际字段值)。在任何情况下,OP 都必须重新设计 DTO。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多