序列化和反序列化具有相同名称的Jackson XML元素

时间:2019-09-12 12:01:02

标签: java xml jackson-databind

我正在尝试使用类Product编写代码和对象以反序列化XML,如下所示:

<list>
  <product id="14032019"><![CDATA[Some text]]></product>
  <product id="14032019" value="Some text"/>
</list>

产品POJO的value属性标注如下,并且在以下情况下适用:

  • <product id="14032019" value="Some text"/>

    @JacksonXmlProperty(isAttribute = true)
    private String value; 
    
  • <product id="14032019"><![CDATA[Some text]]></product>

    @JacksonXmlCData
    @JacksonXmlText
    private String value; 
    

但是当我组合所有注释时,它似乎不起作用。有人遇到这样的问题吗?

编辑:

我尝试使用从父类继承并分别标识的2个不同的子类对@JsonSubTypes进行注释(我遵循https://www.baeldung.com/jackson-annotations中的示例)。 此方法需要XML中每个未在原始XML中提供的标记的属性className

<product className="myPackage.Product1" id="123" value="Some text"/>
<product className="myPackage.Product2" id="123">Some text</product>

在没有className属性的情况下,是否仍要编写自定义映射器或反序列化器?

1 个答案:

答案 0 :(得分:0)

该解决方案的思想是实现特定的解串器。

public class ProductDeserializer extends StdDeserializer<Product> {

  public ProductDeserializer() {
      super(Product.class);
  }

  @Override
  public Product deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException {
    Product p = new Product();

    while (parser.nextToken() != JsonToken.END_OBJECT) {
        String tokenName = parser.getCurrentName();

        switch (tokenName) {
            case "id":
                parser.nextToken();
                p.setId(parser.getText());
                break;

            // when you encounter an attribute called value or "" you take its value 
            case "value":
            case "":
                parser.nextToken();
                p.setValue(parser.getText().trim());
                break;

            default:
                break;
        }
    }
    return p;
  }
}

使用XmlMapper类时必须注册它:

XmlMapper xmlMapper = new XmlMapper();
SimpleModule module = new SimpleModule("configModule", Version.unknownVersion());
module.addDeserializer(Product.class, new ProductDeserializer());
xmlMapper.registerModule(module)

产品POJO具有ID和值作为属性。