首页 > 解决方案 > 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 的类创建一个序列化类?

标签: javafasterxmljsonserializer

解决方案


作品

首先,我建议您在这种特殊情况下使用组合而不是继承。您的代码将如下所示:

    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;
        }
    }

推荐阅读