【问题标题】:Is is possible to deserialize JSON input in an object of non annotated class?是否可以在非注释类的对象中反序列化 JSON 输入?
【发布时间】:2021-09-16 21:25:21
【问题描述】:

我想知道是否可以将 JSON 字符串反序列化为没有注释的类对象。

假设我没有 JSON 模式,也无法生成 pojo 类,但我已经有了没有注释的类。反序列化器有没有办法自动检测类属性和子类属性?

我一直在互联网上寻找解决方案,但所有解决方案都涉及没有子类作为属性的类。就我而言,我有一个复杂的类结构,属性名称也与 JSON 字符串中的元素名称相同或相似。

我还尝试根据我的 JSON 字符串生成类。我用jsonschema2pojo 做到了这一点,但问题是我的 pojo 类只包含 JSON 字符串中列出的元素,因此它们没有完全生成。如果没有 JSON 方案,我无法生成它们。

【问题讨论】:

  • 那么您是否尝试过不带注释的反序列化?如果字段名称匹配,则应该是可能的。请提供一个真实案例。
  • 不,它们不匹配,这是我的问题。只是其中一些匹配。另一个问题:我想要反序列化的类中包含的类没有与 JSON 输入的子字段匹配的所有属性。 ://
  • 这是没有注释的类:github.com/graphhopper/graphhopper/blob/master/api/src/main/…@pirho,例如,在我的 JSON 输入中,我有一个名为“hints”的字段,但是在这个类中没有具有该标识符的属性,但是“ hintsMap”,这就是为什么我得到一个错误,即这个字段不能被类中的任何属性引用。
  • 虽然指向完整代码的链接有时很有用,但创建MRE 通常更有用。猜猜mixin是解决方案。

标签: java json jackson deserialization


【解决方案1】:

是的,您可以在没有 Jackson 注释的情况下序列化/反序列化类型。这在tutorial 中得到了清楚的证明:

public class MyValue {
  public String name;
  public int age;
  // NOTE: if using getters/setters, can keep fields `protected` or `private`
}

还有:

ObjectMapper mapper = new ObjectMapper();
MyValue value = mapper.readValue("{\"name\":\"Bob\", \"age\":13}", MyValue.class);
String jsonString = mapper.writeValueAsString(myResultObject);

如果您需要自定义没有注释的类型的序列化(因为您不控制这些类,或者因为您不想用 Jackson 注释或任何其他原因污染它们),请使用mixins。使用它,您可以定义一个与要序列化/反序列化的类型具有相同属性名称的类型,并在那里定义注释。然后你指示杰克逊(反)序列化一个对象,但使用来自 mixin 的配置:

public class CannotModify {
  String name;
  Date birthdate;
}

public class MixIn {
  @JsonFormat(...)
  Date birthdate;
}

objectMapper.addMixInAnnotations(CannotModify.class, MixIn.class);
// now this ObjectMapper will use the format specified in the MixIn
// to format the birthdate field of CannotModify

查看完整文档以了解其他有趣的功能。


现在,如果属性名称不匹配,您可以使用 @JsonProperty 并为其指定 JSON 属性的名称。因此,继续上面的示例,假设您想要(反)序列化为 CannotModify 的 JSON 如下:

{
  "onoma": "...",
  "birth_date": "..."
}

只需将 mixin 注释为:

public class MixIn {
  @JsonProperty("onoma")
  String name;

  @JsonProperty("birth_date")
  @JsonFormat(...)
  Date birthdate;
}

【讨论】:

  • 您好,谢谢您的回答,如果类中的属性与 JSON 输入中的字段名称匹配,这是可能的。就我而言,它们中只有一些匹配,有些相似,但它们不匹配。因此,在这种情况下,在类属性中找不到字段值(名称不匹配)。
  • 在这种情况下,在 mixin 上使用 @JsonProperty,请参阅编辑。而且杰克逊可以以更复杂的方式处理更复杂的场景,但如果没有具体的例子,这与问题无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 2014-07-27
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
相关资源
最近更新 更多