java - jackson 转发属性而不是外部对象

标签 java jackson

我有一个对象用作 REST Web 服务 (jax-rs) 中的返回类型。该对象包含一个字段,该字段是另一种类型的数组。示例:

  @Name("PARAMETER_DEFINITION_TABTYPE")
  @TableOfDefinition
  @XmlType(
      name = "parameter_DEFINITION_TABTYPE"
  )
  class PARAMETER_DEFINITION_TABTYPE {

    @XmlElement(
        name = "parameter_definition_rectype",
        nillable = true
    )
    public PARAMETER_DEFINITION_RECTYPE[] ELEMENTS;

    @Override
    public String toString() {
      return ELEMENTS == null ? null : java.util.Arrays.toString(ELEMENTS);
    }
  }

我使用所有现有的注释来创建我的 SOAP Web 服务并且不想触及类或现有的注释。我创建的 REST 服务使用相同的类并生成以下 json:

{"parameter_definition_rectype": [
   {
       "name": "abc"
   },
   {
       "name": "abss"
   }
]}

我想得到以下输出(基本上忽略外部元素,只使用“ELEMENTS”字段):

[
   {
       "name": "abc"
   },
   {
       "name": "abss"
   }
]

当 PARAMETER_DEFINITION_TABTYPE 嵌套在另一个对象中时,我还想忽略外部对象。 有没有一种方法可以通过使用注释来实现?

谢谢!

最佳答案

您可以为 PARAMETER_DEFINITION_TABTYPE 类定义自定义序列化器和反序列化器,这将改变 ObjectMapper 处理它的方式。

这在 wiki Jackson How-To: Custom Serializers 中有解释,如果您不能向 PARAMETER_DEFINITION_TABTYPE 类添加新注释,您应该使用 a custom module .

它或多或少是下面的代码。这里的问题是您必须提供大量自定义代码才能获得所需的行为。用一个单独的类来表示 JSON 对象会更清晰,因为它不同于 XML 对象:

public static void main(String[] args) throws Exception {
    SimpleModule module = new SimpleModule("WrapperModule", new Version(1, 0, 0, null));
    module.addSerializer(Wrapper.class, new WrapperSerializer(Wrapper.class));
    module.addDeserializer(Wrapper.class, new WrapperDeserializer(Wrapper.class));

    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(module);

    Wrapper in = new Wrapper();
    in.elements = new String[]{"a", "b", "c"};

    String json = mapper.writeValueAsString(in);
    System.out.println(json);

    Wrapper out = mapper.readValue(json, Wrapper.class);
    System.out.println(Arrays.toString(out.elements));
}


public static class Wrapper {

    public String[] elements;

}

public static class WrapperSerializer extends StdSerializer<Wrapper> {

    public WrapperSerializer(Class<Wrapper> t) {
        super(t);
    }

    @Override
    public void serialize(Wrapper w, JsonGenerator gen, SerializerProvider provider) throws IOException {
        provider.defaultSerializeValue(w.elements, gen);
    }

}

public static class WrapperDeserializer extends StdDeserializer<Wrapper> {

    public WrapperDeserializer(Class<Wrapper> c) {
        super(c);
    }

    @Override
    public Wrapper deserialize(JsonParser p, DeserializationContext ctx) throws IOException {
        Wrapper w = new Wrapper();
        w.elements = ctx.readValue(p, String[].class);
        return w;
    }
}

关于java - jackson 转发属性而不是外部对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53886234/

相关文章:

java - 打开 zip 文件时出错或缺少 : build/tmp/expandedArchives/org. jacoco.agent 的 JAR list

java - 使用 Executors.newFixedThreadPool 的异步 Java NIO 需要帮助

java - 如何从 20.35 到 23.35 每 30 分钟,一周中的某些天运行一次工作?

java - 使用 Jackson 反序列化带有列表的 XML

json - 使用 lombok 自定义序列化和反序列化字段名称

java - 如何通过从微调器中选择来启用 wifi

java - 如何在Java代码中获取属性文件(目标文件夹中已存在的已编译文件)的更新值

java - 如何将 JSON 字符串转换为 Java 对象列表?

java - Jackson - 如何从 JsonNode 获取对象? Jawampa [Web 应用程序消息传递协议(protocol) - 到 Java]

java - jackson View 中的 DEFAULT_VIEW_INCLUSION 设置有问题