是否可以仅使用注释序列化Jackson中没有字段的对象?当我尝试序列化这样一个没有注释的对象时,我得到:
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class [redacted].SubjectObjectFeatureExtractor and no properties discovered to create BeanSerializer
我已经检查过list of Jackson annotations而没有看到将类注释为没有可序列化数据的方法。我尝试将@JsonCreator
放在空构造函数上(不要期望它工作,因为它是反序列化注释),我得到了同样的错误。没有可以放置@JsonProperty
的访问者或字段。有什么想法吗?
更新:这样做的原因是我有一个对象列表,表示可以应用于某种类型数据的转换。其中一些转换是由需要序列化的参数定义的,但其中一些是无参数的(所讨论的无数据对象)。我希望能够序列化和反序列化这些转换的序列。另外,我正在使用DefaultTyping.NON_FINAL
,以便序列化类名。
更新:示例类
class ExtractSomeFeature implements FeatureExtractor<SomeOtherType> {
public void extractFeature(SomeOtherType obj, WeightedFeatureList output) {
// do stuff
}
}
我并不特别关心JSON如何看待,只要我能正确反序列化List<FeatureExtractor>
。我的印象是使用默认类型,预期的JSON类似于:
['com.mycompany.foo.ExtractSomeFeature', {}]
FeatureExtractor
的其他子类将具有真实参数,因此它们可能看起来像:
[`com.mycompany.foo.SomeParameterizedFeature', {some actual JSON stuff in here}]
我想我可以在某个@JsonValue
方法上使用toJSONString()
来返回{}
,但如果可能的话,我想向将要创建{{}的最终用户隐藏这样的hackery 1}}子类。
答案 0 :(得分:8)
您必须配置对象映射器以支持此案例。
ObjectMapper objectMapper = ...
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
此功能的文档可在此处找到:Fail on empty beans
确定未找到访问者时会发生什么的功能 类型(并没有注释表明它的意思是 序列化)。如果启用(默认),则抛出异常以指示 这些是不可序列化的类型;如果禁用,则将它们序列化为 空对象,即没有任何属性。
答案 1 :(得分:6)
将以下注释添加到类中似乎可以解决问题:
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.NONE)
添加不相关的注释,如
@JsonRootName("fred")
似乎也解决了这个问题。这似乎与JIRA票证中的声明相匹配,即在该类中添加任何Jackson注释将阻止该例外。但是,似乎在类中添加注释不会。
答案 2 :(得分:0)
我不确定是否收到您的问题,但您可能需要JsonInclude.Include.NON_DEFAULT,JsonInclude.Include.NON_NULL或JsonInclude.Include. NON_EMPTY。
答案 3 :(得分:0)
disable SerializationFeature.FAIL_ON_EMPTY_BEANS
的答案是全球性的,因此您可能不希望应用它。
对add any serialisation annotation的回答显示了正确的解决方法(如SerializationFeature.FAIL_ON_EMPTY_BEANS
的Javadoc所建议的),但只能使用朴实的注释或不相关的注释。
仅添加...
@JsonSerialize
…对我的班级(甚至不加括号,以免引起争论!)我能够产生相同的效果(再次由SerializationFeature.FAIL_ON_EMPTY_BEANS
的Javadoc指出)。