我想使用 Jackson
JsonNode
来解析经常具有这种类型结构的 XML 文件:
<list>
<element>
<a>value 1a</a>
<b>value 1b</b>
</element>
<element>
<a>value 2a</a>
<b>value 2b</b>
</element>
</list>
然而,有时相同的列表只包含 1 个元素,就像这个:
<list>
<element>
<a>value a</a>
<b>value b</b>
</element>
</list>
我在使用
JsonNode
时遇到的问题是,JsonNode.get("element")
对于第一个 XML 返回 ArrayNode
,但对于第二个 XML 返回 ObjectNode
。 我知道这可以通过这一行来解决:
elements = elements.isArray() ? elements : new XmlMapper().createArrayNode().add(elements);
但我想使用更简单的解决方案,例如使用始终返回
JsonNode
的 ArrayNode
方法。 像JsonNode.getArray("element")
这样的东西就完美了。
你知道杰克逊是否可以做到这一点吗?
这是完整的代码:
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.io.IOException;
public class JacksonTest {
public static void main(String[] args) throws Exception {
String xmlExample1 = """
<list>
<element>
<a>value 1a</a>
<b>value 1b</b>
</element>
<element>
<a>value 2a</a>
<b>value 2b</b>
</element>
</list>
""";
String xmlExample2 = """
<list>
<element>
<a>value a</a>
<b>value b</b>
</element>
</list>
""";
processXml(xmlExample1);
processXml(xmlExample2);
}
private static final XmlMapper XM = new XmlMapper();
private static void processXml(String xml) throws IOException {
JsonNode rootNode = XM.readTree(xml);
JsonNode elements = rootNode.get("element");
elements = elements.isArray() ? elements : XM.createArrayNode().add(elements);
for (JsonNode element : elements) {
System.out.println("Value: " + element.get("a").asText());
}
}
}
我不认为有什么好的方法。你需要做一个
field.isArray()
所以不要打电话
rootNode.get("element")
您可以自己实施
private static ArrayNode getArrayNode(JsonNode node, String fieldName) {
JsonNode field = node.get(fieldName);
if (field == null) {
return XM.createArrayNode();
}
return field.isArray() ? (ArrayNode) field : XM.createArrayNode().add(field);
}