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

2022-09-02 12:45:54

是否可以仅使用注释序列化 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是什么样子的,只要我能正确地反序列化s。我的印象是,使用默认类型,预期的JSON将如下所示:List<FeatureExtractor>

['com.mycompany.foo.ExtractSomeFeature', {}]

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

[`com.mycompany.foo.SomeParameterizedFeature', {some actual JSON stuff in here}]

我想我可以使用一些方法来返回,但是如果可能的话,我想向将要创建子类的最终用户隐藏这些黑客行为。@JsonValuetoJSONString(){}FeatureExtractor


答案 1

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

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

此功能的文档可以在这里找到:在空bean上失败

该功能确定在找不到某个类型的访问器时发生的情况(并且没有注释来指示该类型应进行序列化)。如果启用(默认),则会引发异常以指示这些类型为不可序列化的类型。如果禁用,它们将被序列化为空对象,即没有任何属性。


答案 2

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

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

只需添加...

@JsonSerialize

...到我的班级(甚至没有括号后面的括号,以免单独争论!我能够产生相同的效果(再次,如 Javadoc 所示)。SerializationFeature.FAIL_ON_EMPTY_BEANS