java - FasterXml - JsonSerializer HashMap
问题描述
我正在使用 jackson-databind 版本 2.12.3 来序列化应该返回的对象的返回,如下所示:
{
"field1":"value1",
"field2":"value2",
"links":{
"field":{
"href":"/link"
},
"test":{
"href":"/test"
}
}
}
我的课是这些:
public class HrefType {
private String href = null;
...
}
public class Link extends HashMap<String, HrefType> {
private HrefType field = null;
...
}
public class MyObject {
private String field1 = null;
private String field2 = null;
private Link links = null;
...
}
返回是 myObject:
MyObject myObject = new MyObject();
myObject.setField1("value1");
myObject.setField2("value2");
Link link = new Link();
link.setField(new HrefType().href("/link"));
link.put("test",new HrefType().href("/test"));
myObject.setLinks(link);
然而,使用默认的 ObjectMapper,“link.setField”被忽略,返回的 json 为:
{
"field1":"value1",
"field2":"value2",
"links":{
"test":{
"href":"/test"
}
}
}
我尝试使用 JsonSerializer 进行一些测试,但无法为所有扩展 HashMap 的类做一些通用的事情(这些类是从 BerlinGroup 的 PSD2 YAML 生成的,所以我不想更改生成的类)。
有没有通用的方法,或者我应该为每个扩展 HashMap 的类创建一个序列化类?
解决方案
作品
首先,我建议您在这种特殊情况下使用组合而不是继承。您的代码将如下所示:
private class Link {
private final HrefType field;
private final HashMap<String, HrefType> test;
public Link(HrefType field) {
this.field = field;
}
public HrefType getField() {
return field;
}
public HashMap<String, HrefType> getTest() {
return test;
}
}
正如预期的那样,序列化将正常工作。
串行器
但是,如果您无法更改原始代码,则可以编写自己的StdSerializer
. 例如:
private class LinkSerializer extends StdSerializer<Link> {
public LinkSerializer() {
super(Link.class);
}
@Override
public void serialize(Link link, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeStartObject();
final HrefType field = link.getField();
jsonGenerator.writeObjectField("field", field);
jsonGenerator.writeObjectField("test", new HashMap<>(link));
jsonGenerator.writeEndObject();
}
}
Link
并在您的班级上声明它:
@JsonSerialize(using = LinkSerializer.class)
private static class Link extends HashMap<String, HrefType> {
private final HrefType field;
public Link(HrefType field) {
this.field = field;
}
public HrefType getField() {
return field;
}
}
推荐阅读
- javascript - Facebook 广告:如何创建像素自定义 Javascript 事件来检测对 Youtube 视频的点击
- amazon-web-services - 关于验证 Secrets Manager 的凭证轮换 Lambda 函数是否成功的问题
- angular - 如何从指令中访问某种类型的所有子组件?
- php - 删除一年中的月份
- java - Long 和 Double 比较 (==) 的行为不同
- python - 如何从没有numpy的多维数组中提取一行?
- javascript - 将 $_POST 变量传递给新 URL,然后返回到以前的 URL - 最佳实践?
- unit-testing - Kafka Streams 测试:java.util.NoSuchElementException:未初始化的主题:“output_topic_name”
- acumatica - 如何在屏幕和导入场景中避免 Acumatica 网格中的重复条目
- android - 如何对 LiveData 转换进行单元测试