在Jackson中序列化没有数据的对象

时间:2014-01-21 00:12:19

标签: java serialization jackson

是否可以仅使用注释序列化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}}子类。

4 个答案:

答案 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_DEFAULTJsonInclude.Include.NON_NULLJsonInclude.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指出)。