我的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以实现所需的序列化?
答案 0 :(得分:2)
您正在将枚举实例序列化为名为 segmentSource 的字段。
该字段的名称是不是名称!
除此之外,你的代码中还有一个潜在的错误:枚举就是singeltons!例如,将有一个的FOLLOWED实例。这意味着:对“FOLLOWED”列表的任何更改都是“全局”可见的。没有两个不同的SegmentCreateRequests(并行)。
换句话说:当你创建一些
时SegmentCreateRequests reqA = ...
某些特定用户在FOLLOWED上;但是你做了
SegmentCreateRequests reqB = ...
并行,那么这两个请求对象最终将在相同的列表中工作。含义:您的代码不是线程安全的。因此:用户列表必须不进入枚举常量。它应该是周围请求的属性!