我正在尝试使用类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属性的情况下,是否仍要编写自定义映射器或反序列化器?
答案 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和值作为属性。