java—可以在非注解类的对象中反序列化json输入吗?

sxpgvts3  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(281)

我想知道是否有可能将json字符串反序列化为没有注解的类对象。
假设我没有json模式,也不能生成pojo类,但我已经有了没有注解的类。反序列化程序是否可以自动检测类属性和子类属性?
我一直在互联网上寻找解决方案,但所有的解决方案都涉及到没有子类作为属性的类。在我的例子中,我有一个复杂的类结构,属性名也与json字符串中的元素名相同或相似。
我还尝试根据json字符串生成类。我使用jsonschema2pojo实现了这一点,但问题是我的pojo类只包含json字符串中列出的元素,因此它们没有完全生成。没有json方案,我无法生成它们。

6ovsh4lw

6ovsh4lw1#

是的,您可以在不使用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注解或任何其他原因污染它们),请使用mixin。使用它,您可以定义一个与要在其中序列化/反序列化和定义注解的类型具有相同属性名称的类型。然后指示jackson(反)序列化一个对象,但使用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属性的名称。因此,继续上面的示例,假设要(反)序列化到的json CannotModify 详情如下:

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

只需将mixin注解为:

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

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

相关问题