为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

holdtom 2023-07-28 15:18:09
我正在尝试编写代码和对象来使用类反序列化 XML,如下所示Product:<list>  <product id="14032019"><![CDATA[Some text]]></product>  <product id="14032019" value="Some text"/></list>Product POJO 具有注释如下的 value 属性,它适用于这些情况:<product id="14032019" value="Some text"/>:@JacksonXmlProperty(isAttribute = true)private String value; <product id="14032019"><![CDATA[Some text]]></product>:@JacksonXmlCData@JacksonXmlTextprivate String value; 但当我组合所有注释时,它似乎不起作用。有人遇到过这样的问题吗?编辑:我尝试使用从父类继承并单独标识的 2 个不同子类进行注释(我按照https://www.baeldung.com/jackson-annotations@JsonSubTypes中的示例进行操作)。此方法需要在 XML 中为每个标记调用一个属性,而原始 XML 中未提供该属性。className<product className="myPackage.Product1" id="123" value="Some text"/><product className="myPackage.Product2" id="123">Some text</product>对于没有 className 属性的情况,是否可以编写自定义映射器或反序列化器?
查看完整描述

1 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

该解决方案背后的想法是实现一个特定的解串器。


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 和 value 作为属性。


查看完整回答
反对 回复 2023-07-28
  • 1 回答
  • 0 关注
  • 111 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信