java - 是否可以在非注释类的对象中反序列化 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 注释或任何其他原因污染它们),请使用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;
}
推荐阅读
- symfony - 自定义规范器的 API 平台文档
- hibernate - 使用 Spring Boot JPA 检查 MySQL DB 连接 - 如何设置 Hikari 的超时
- date - SAP 网关服务器中的 DatePicker 值不匹配
- javascript - 使用JS在websql中插入表单数据创建动态表单
- keras - 如何引用多输出模型的一个输出
- pepper - Pepper 机器人参与和动画
- html - 来自检查器 HTML 的不同 HTTP 响应
- flutter - 下一页流未在 Flutter 上更新
- javascript - Plotly Vue TypeError:vue_plotly__WEBPACK_IMPORTED_MODULE_1__.Plotly.newPlot 不是函数
- html - 添加/更改选项时的 Mat-chip-list 调用函数