是否可以在非注释类的对象中反序列化JSON输入



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

假设我没有JSON模式,也不能生成pojo类,但我已经有了没有注释的类。有没有一种方法可以让反序列化程序自动检测类属性和子类属性?

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

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

是的,您可以在没有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属性的名称。因此,继续上面的例子,假设要(反(序列化到CannotModify的JSON如下:

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

只需将mixin注释为:

public class MixIn {
@JsonProperty("onoma")
String name;
@JsonProperty("birth_date")
@JsonFormat(...)
Date birthdate;
}

最新更新