【问题标题】:Serialize an object with no data in Jackson序列化杰克逊中没有数据的对象
【发布时间】:2014-02-10 08:59:06
【问题描述】:

是否可以仅使用注释来序列化 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&lt;FeatureExtractor&gt;s 即可。我的印象是,使用默认类型,预期的 JSON 会是这样的:

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

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

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

我想我可以在某些toJSONString() 方法上使用@JsonValue 来返回{},但如果可能的话,我想对将创建FeatureExtractor 子类的最终用户隐藏这样的黑客行为。

【问题讨论】:

  • 所以你只想要一个空的{}?那有什么目的?
  • @SotiriosDelimanolis:我已根据您的问题更新了问题。
  • 请举例说明您想要序列化的对象类型以及您期望生成的 JSON 是什么。
  • @SotiriosDelimanolis:问题已更新。
  • Jackon 的 JIRA 中存在一个相关问题:jira.codehaus.org/browse/…,这似乎表明该问题已解决,因此带有其他 Jackson 注释的 POJO(例如,我假设空构造函数上的 @JsonCreator)应该不抛出异常。然而,情况似乎并非如此。

标签: java serialization jackson


【解决方案1】:

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

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

此功能的文档可以在这里找到:Fail on empty beans

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

【讨论】:

  • 这个答案不依赖于黑客,因此更“正确”。谢谢!
【解决方案2】:

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

add any serialisation annotation 的答案显示了修复它的正确方法(如:SerializationFeature.FAIL_ON_EMPTY_BEANS 的 Javadoc 建议),但只能使用 hackish 或不相关的注释。

只需添加……

@JsonSerialize

…对我的班级(甚至没有括号,更不用说争论!)我能够产生相同的效果(同样,SerializationFeature.FAIL_ON_EMPTY_BEANS 的 Javadoc 指出)。

【讨论】:

    【解决方案3】:

    在类中添加如下注解似乎可以解决问题:

    @JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.NONE)
    

    添加一个不相关的带注释的like

    @JsonRootName("fred")
    

    似乎也可以解决它。这似乎与 JIRA 票证中的声明相匹配,即在类中添加任何 Jackson 注释将防止异常。但是,在类中添加注释似乎没有。

    【讨论】:

      【解决方案4】:

      不确定我是否明白你的问题,但也许你想要JsonInclude.Include.NON_DEFAULTJsonInclude.Include.NON_NULLJsonInclude.Include. NON_EMPTY

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-14
        • 2014-10-10
        • 1970-01-01
        • 1970-01-01
        • 2016-12-07
        • 2019-11-15
        • 2014-06-10
        相关资源
        最近更新 更多