如何使用 Jackson 解析 XML 列表而不需要 1 元素列表的特殊情况?

问题描述 投票:0回答:1

我想使用 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());
        }
    }
}
java xml jackson jackson-dataformat-xml
1个回答
0
投票

我不认为有什么好的方法。你需要做一个

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.