繁体   English   中英

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

[英]Serialize an object with no data in 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 

我已经检查了Jackson注释列表,却没有看到将类注释为没有可序列化数据的方法。 我尝试将@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}]

我想我可以在一些toJSONString()方法上使用@JsonValue来返回{} ,但是如果可能的话,我想向将要创建FeatureExtractor子类的最终用户隐藏这样的hackery。

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

ObjectMapper objectMapper = ...
  objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

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

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

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

@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.NONE)

添加无关的注释类似

@JsonRootName("fred")

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

不确定我会得到你的问题,但也许你想要JsonInclude.Include.NON_DEFAULTJsonInclude.Include.NON_NULLJsonInclude.Include。 NON_EMPTY

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

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

只需添加......

@JsonSerialize

...到我的班级(在它之后甚至不是parenthesēs,以免单独的论点!)我能够产生相同的效果(再次,由SerializationFeature.FAIL_ON_EMPTY_BEANS的Javadoc表示)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM