【问题标题】:Deserialize JSON for a class I dont own with custom getters使用自定义 getter 为我不拥有的类反序列化 JSON
【发布时间】:2019-06-20 00:30:00
【问题描述】:

我正在尝试反序列化我不拥有的类的对象。该类具有id_address_name_等属性名称,但其getter为getId()getAddress()getName()等。

当我尝试使用 Jackson 反序列化 JSON 时,我得到了

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "id_", not marked as ignorable

这似乎是因为 Jackson 正在寻找 getId_() 而不是 getId()。由于我不拥有底层类,因此我无法使用 Jackson 的注解将属性映射到自定义 json 字段。

如何使用对象属性到其 getter 方法的自定义映射来反序列化?

【问题讨论】:

  • 或许可以试试 Jackson 的 JsonNode:tutorials.jenkov.com/java-json/jackson-jsonnode.html
  • 不是一个完美的解决方案,但您可以创建自己的类,反序列化到该类并使其具有toOriginalClass() 方法。
  • 您的 JSON 输入是什么样的?是{"id":123, "name":"John Doe"} 还是{"id_":123, "name_":"John Doe"}
  • @ThomasFritsch 后者。 JSON 看起来像 {"id_":123, "name_":"John Doe"}
  • @korolar,希望尽可能避免这种情况。由于我们不拥有原始类,因此我不想与所有者可能做出的任何更改相结合

标签: java json jackson deserialization jackson-databind


【解决方案1】:

您可以尝试自定义反序列化器。

签出:https://www.baeldung.com/jackson-deserialization

这样你就可以为类注册一个反序列化器。

但是,当类更改时,您仍然需要对其进行编辑。

您可以尝试的另一件事:

mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);

这将使映射器完全访问私有成员。

【讨论】:

    【解决方案2】:

    您可以为 Jackson 应用 MixIn - 这就是我尝试序列化和反序列化 JSON 以用于自动生成的 AVRO 类 (Avro generated class issue with json conversion [kotlin]) 的问题的解决方法

    这是一个例子:

    https://medium.com/@shankar.ganesh.1234/jackson-mixin-a-simple-guide-to-a-powerful-feature-d984341dc9e2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 2014-08-02
      • 2013-10-10
      相关资源
      最近更新 更多