首页 > 解决方案 > 是否可以在非注释类的对象中反序列化 JSON 输入?

问题描述

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

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

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

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

标签: javajsonjacksondeserialization

解决方案


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

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 属性的名称。因此,继续上面的示例,假设您想要(反)序列化的 JSONCannotModify如下:

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

只需将 mixin 注释为:

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

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

推荐阅读