Jackson序列化-动态更改元素名称

时间:2020-07-15 10:48:49

标签: java json jackson gson

我必须将以下XML转换为JSON:

<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中使用杰克逊注释,因为这些类来自第三方资源。

我认为我可以像这样使用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)中有解决方案,请不要饶恕我!

1 个答案:

答案 0 :(得分:0)

一些想法:

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

  1. 根据您的目标json创建带有jackson批注的pojo
  2. 使用像推土机这样的bean映射器将bean映射到pojo
  3. 从pojo序列化为json

http://dozer.sourceforge.net/

相关问题