我正在尝试做一些在gson中非常容易的事情。由于我切换到杰克逊作为序列化器,我无法弄清楚如何实现这个:
我想仅序列化已由Annotation标记的字段。 GSON代码将是:
class Foo {
@Expose
public String sometext="Hello World";
@Expose
public int somenumber=30;
public float noop=1.0;
...
}
应该导致(JSON)
{
Foo: {
sometext:'Hello World',
somenumber: 30
}
}
(语法错误可能会被忽略 - source仅用于演示)
那么杰克逊的@Expose
和new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
的杰克逊对手是什么?
答案 0 :(得分:4)
如果您只想要特定类型,您也可以使用注释:
@JsonAutoDetect(
fieldVisibility = Visibility.NONE,
setterVisibility = Visibility.NONE,
getterVisibility = Visibility.NONE,
isGetterVisibility = Visibility.NONE,
creatorVisibility = Visibility.NONE
)
public class Foo {
@JsonProperty
public String sometext="Hello World";
@JsonProperty
public int somenumber=30;
// noop won't get serialized
public float noop= 1.0f;
}
答案 1 :(得分:2)
在杰克逊,你做反过来。使用@JsonIgnore
注释您不想要的字段。
标记注释,指示带注释的方法或字段 被基于内省的序列化和反序列化忽略 功能。也就是说,不应该考虑" getter"," setter" 或"创作者"。
答案 2 :(得分:2)
似乎有一种方法可以配置ObjectMapper
来忽略所有未注释的字段。
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibilityChecker(getSerializationConfig().getDefaultVisibilityChecker()
.withCreatorVisibility(JsonAutoDetect.Visibility.NONE)
.withFieldVisibility(JsonAutoDetect.Visibility.NONE)
.withGetterVisibility(JsonAutoDetect.Visibility.NONE)
.withIsGetterVisibility(JsonAutoDetect.Visibility.NONE)
.withSetterVisibility(JsonAutoDetect.Visibility.NONE));
答案 3 :(得分:2)
new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
的对应部分是按如下方式初始化ObjectMapper:
...
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(MapperFeature.AUTO_DETECT_CREATORS,
MapperFeature.AUTO_DETECT_FIELDS,
MapperFeature.AUTO_DETECT_GETTERS,
MapperFeature.AUTO_DETECT_IS_GETTERS);
...
@Expose
的对应方是@JsonProperty
。使用上面的示例bean:
class Foo {
@JsonProperty
public String sometext="Hello World";
@JsonProperty
public int somenumber=30;
public float noop=1.0;
...
}
请参阅this answer一个非常相似的问题。