gpt4 book ai didi

java - Jackson:自定义反序列化器:无法使用数组反序列化 XML

转载 作者:行者123 更新时间:2023-12-01 18:29:29 24 4
gpt4 key购买 nike

我使用 Jackson 将我的一个类序列化为 XML。由于内部结构复杂,我使用自定义序列化器将此数据生成为数组。

生成的 XML 在简化示例中如下所示:

<MyDataType>
<list>
<entry>
<order>0</order>
<value>And then a step to the right</value>
</entry>
<entry>
<order>1</order>
<value>It's just a jump to the left</value>
</entry>
<entry>
<order>2</order>
<value>With your hands on your hips</value>
</entry>
</list>
</MyDataType>

我只有在反序列化时才会遇到问题。然后 jsonParser.getCodec().readTree(jsonParser) 就“看到”了数组的最后一个条目。所有其他条目都将丢失。

因此解串器中的调试输出将显示:

Deserialize: Incoming data:
{
"list": {
"entry": {
"order": "2",
"value": "With your hands on your hips"
}
}
}

更奇怪的是:如果我序列化/反序列化为 JSON,相同的代码可以正常工作!

解串器:

class MyDataTypeDeserialize extends JsonDeserializer<MyDataType> {
@Override
public MyDataType deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
MyDataType result = new MyDataType();

JsonNode rootNode = jsonParser.getCodec().readTree(jsonParser);

// Shows only one entry when using XML
System.out.println("Deserialize: Incoming data: " + rootNode.toString());

JsonNode valueList = rootNode.get("list");
JsonNode entryList = valueList.findValue("entry");

for (Iterator<JsonNode> it = entryList.elements(); it.hasNext(); ) {
JsonNode element = it.next();

int order = element.get("order").asInt();
String value = element.get("value").asText();

result.addValue(order, value);
}

return result;
}
}

任何关于我做错的事情的提示将不胜感激。

最佳答案

[已编辑]

几年前我遇到了同样的问题。默认情况下,Jackson(最具体的是 UntypedObjectDeserializer)当看到多个具有相同名称的子项时,它不会将它们映射到数组或列表中。我所做的是我使用了这个库:https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.json%22%20AND%20a%3A%22json%22这样你就可以做到:

JSONObject jsonObject = XML.toJSONObject(...);
String jsonText = jsonObject.toString();
// Use Jackson here

当然,在实际反序列化为 Jackson 节点之前,这是一个额外的解析和序列化步骤。上面的内容对我来说效果很好,因为它不在应用程序的关键路径上。

[编辑]

如果您需要在反序列化器中使用 JsonParser,您可以尝试如下操作:

JsonLocation start = jp.getCurrentLocation();
jsonParser.getCodec().readTree(jsonParser); // The result is ignored
JsonLocation end = jp.getCurrentLocation();

String xmlText = end.getSourceRef().toString().substring(start.getCharOffset() - 1, end.getCharOffset());

JSONObject jsonObject = XML.toJSONObject(xmlText);
String jsonText = jsonObject.toString();

// Parse jsonText into JsonNode

或者替代解决方案:https://github.com/DinoChiesa/deserialize-xml-arrays-jackson/blob/master/src/main/java/com/google/xmldeser/ArrayInferringUntypedObjectDeserializer.java

关于java - Jackson:自定义反序列化器:无法使用数组反序列化 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60186499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com