我正在尝试做一些在 gson 中非常简单的事情。自从我改用 Jackson 作为序列化器后,我不知道如何实现这个:
我只想序列化已用注释标记的字段。 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
}
}
(语法错误可以忽略 - 源代码仅供演示)
那么 gson 的
@Expose
和 new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
的 Jackson 对应项是什么?
如果您只想将其用于特定类型,您也可以只使用注释:
import com.fasterxml.jackson.annotation.JsonAutoDetect;
@JsonAutoDetect(
fieldVisibility = JsonAutoDetect.Visibility.NONE,
setterVisibility = JsonAutoDetect.Visibility.NONE,
getterVisibility = JsonAutoDetect.Visibility.NONE,
isGetterVisibility = JsonAutoDetect.Visibility.NONE,
creatorVisibility = JsonAutoDetect.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;
}
与
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;
...
}
请参阅这个答案,这是一个非常相似的问题。
似乎有一种方法可以配置
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));
@JsonIgnore
注释您不需要的字段。
标记注释,指示被注释的方法或字段是 被基于内省的序列化和反序列化忽略 功能。也就是说,它不应该被视为“getter”、“setter” 或“创造者”。