【问题标题】:Jackson serialization - dynamically change element nameJackson 序列化 - 动态更改元素名称
【发布时间】:2020-07-15 10:48:49
【问题描述】:

我有以下必须转换为 JSON 的 XML:

<acme>
    <acme_name>1</acme_name>
    <acme_type>2</acme_type>
    <desc>desc0</desc>
</acme>

我想要以下 JSON:

{
   "acme":{
      "name":"1",
      "type":"2",
      "desc":"desc0"
   }
}

所以我想要的是

  • 如果元素名称包含下划线,则使用文本作为下划线后面的元素名称
  • 保持其他元素名称不变

在 XML 后面有带有 @XmlElement 注释的 Java bean。
我不能在 Java bean 中使用 jackson 注释,因为这些类来自第 3 方源。

我以为我可以使用JsonSerializer 喜欢

class GeneralSerializer extends JsonSerializer {

    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        ...
    }
}

但我必须指定要序列化的 Java bean(见下文),并且我不能对所有元素使用相同的序列化程序。

public class ItemSerializer extends JsonSerializer<Item>

问题在于 XML 中有很多不同的元素,并指定它们执行相同操作的序列化程序(即搜索下划线字符并仅使用其后的文本)似乎有点矫枉过正。

我能否指定一个可应用于每个元素的通用序列化程序?
有没有其他解决方案?

感谢您的帮助!

----------------- 更新 1 -----------------

我想强调的是,我没有 XML 文本,但我有代表 XML 的 Java bean(用 @Xml... 注释)。

----------------- 更新 2 -----------------

我不坚持杰克逊。如果另一个 JSON 库(例如 GSON)中有解决方案,请不要放过我!

【问题讨论】:

  • 您可以将文本序列化为 Map,然后遍历所有叶子并根据需要重写。
  • 用它构造一个 DOM,循环遍历它并随心所欲地编写
  • 您好,感谢您的回复!我有 Java bean 而不是 XML 文本。冷你请详细说明你的想法?谢谢!

标签: java json jackson gson


【解决方案1】:

一些想法:

  1. 将 bean 序列化为 xml,然后应用 xslt 转换来重命名标签/更改结构以更接近所需的 json
  2. 使用 jackson 注释创建 pojo 并使用 jackson xml 模块进行反序列化
  3. 从 pojo 序列化为 json

  1. 根据你的目标 json 创建带有杰克逊注解的 pojo
  2. 使用 dozer 之类的 bean 映射器将 bean 映射到 pojo
  3. 从 pojo 序列化为 json

http://dozer.sourceforge.net/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 2015-06-13
    相关资源
    最近更新 更多