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

Rya*_*ard 12 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 
Run Code Online (Sandbox Code Playgroud)

我已经检查了Jackson注释列表,却没有看到将类注释为没有可序列化数据的方法.我尝试@JsonCreator使用空构造函数(不要期望它工作,因为它是反序列化注释),我得到了同样的错误.没有可供使用的访问者或字段@JsonProperty.有任何想法吗?

更新:原因是我有一个对象列表,表示可以应用于某种类型数据的转换.其中一些转换是由需要序列化的参数定义的,但其中一些是无参数的(所讨论的无数据对象).我希望能够序列化和反序列化这些转换的序列.此外,我正在使用,DefaultTyping.NON_FINAL以便类名称将被序列化.

更新:示例类将是

class ExtractSomeFeature implements FeatureExtractor<SomeOtherType> {
    public void extractFeature(SomeOtherType obj, WeightedFeatureList output) {
          // do stuff
    }
 }
Run Code Online (Sandbox Code Playgroud)

我并不特别关心JSON如何看待,只要我能List<FeatureExtractor>正确反序列化s.我的印象是使用默认输入,预期的JSON将是这样的:

['com.mycompany.foo.ExtractSomeFeature', {}]
Run Code Online (Sandbox Code Playgroud)

其他子类FeatureExtractor将具有真实参数,因此它们可能看起来像:

[`com.mycompany.foo.SomeParameterizedFeature', {some actual JSON stuff in here}]
Run Code Online (Sandbox Code Playgroud)

我想我可以使用@JsonValue某种toJSONString()方法返回{},但如果可能的话,我想隐藏那些将要创建FeatureExtractor子类的最终用户的hackery .

wml*_*ski 8

您必须配置对象映射器以支持此情况.

ObjectMapper objectMapper = ...
  objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
Run Code Online (Sandbox Code Playgroud)

可以在此处找到此功能的文档:空豆失败

确定在没有为类型找到访问器时会发生什么的功能(并且没有注释表明它是序列化的).如果启用(默认),则抛出异常以指示这些类型为非可序列化类型; 如果禁用,它们将被序列化为空对象,即没有任何属性.


Rya*_*ard 6

在类上添加以下注释似乎可以解决问题:

@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.NONE)
Run Code Online (Sandbox Code Playgroud)

添加无关的注释类似

@JsonRootName("fred")
Run Code Online (Sandbox Code Playgroud)

似乎也解决了这个问题.这似乎与JIRA票证中的声明相匹配,即在该类中添加任何Jackson注释将阻止该例外.但是,似乎在类中添加注释不会.


mir*_*los 6

禁用SerializationFeature.FAIL_ON_EMPTY_BEANS的答案是全局的,因此您可能不希望应用它。

添加任何序列化注释的答案显示了SerializationFeature.FAIL_ON_EMPTY_BEANS修复它的正确方法(如:建议它的 Javadoc ),但只能使用 hackish 或不相关的注释。

仅仅通过添加…

@JsonSerialize
Run Code Online (Sandbox Code Playgroud)

......到我的班级(甚至没有括号?后面,更不用说参数了!)我能够产生相同的效果(同样,由 的 Javadoc 表明SerializationFeature.FAIL_ON_EMPTY_BEANS)。