使用不同的 JSON 对象名称将 JSON 转换为 Java 中的 XML

Convert JSON to XML in Java with different JSON object names

我有这个 JSON 字符串:

{
    "purpose": {
        "caption": "Purpose",
        "value": "Buy a goat"
    },
    "goatValue": {
        "caption": "Goat value",
        "value": "4500000"
    },
    "loanAmount": {
        "caption": "Loan amount",
        "value": "5000000"
    },
    "childrenInfo": [{
        "gender": {
            "caption": "Gender",
            "value": "Boy"
        },
        "provider": {
            "caption": "Provider",
            "value": "Yes"
        },
        "age": {
            "caption": "Age",
            "value": "5"
        }
    },
    {
        "gender": {
            "caption": "Gender",
            "value": "Girl"
        },
        "provider": {
            "caption": "Provider",
            "value": "No"
        },
        "age": {
            "caption": "Age",
            "value": "17"
        }
    }]
}

我想把它转换成这个xml结构:

<Row>
    <caption>Purpose</caption>
    <value>Buy a goat</value>
</Row>
<Row>
    <caption>Goat value</caption>
    <value>4500000</value>
</Row>
<Row>
    <caption>Loan amount</caption>
    <value>5000000</value>
</Row>
<Row>
    <caption>Gender</caption>
    <value>Boy</value>
</Row>
<Row>
    <caption>Provider</caption>
    <value>Yes</value>
</Row>
<Row>
    <caption>Age</caption>
    <value>5</value>
</Row>
<Row>
    <caption>Gender</caption>
    <value>Girl</value>
</Row>
<Row>
    <caption>Provider</caption>
    <value>No</value>
</Row>
<Row>
    <caption>Age</caption>
    <value>17</value>
</Row>

假设这适用于任何 JSON 对象名称(在本例中为 purpose,goatValue 和 loanAmount),因为无法知道 JSON 对象的名称。我试过使用 Jackson ObjectMapper 并将 JSON 字符串映射到

HashMap<String, HashMap<String, String>>

,但现在我不知道该怎么办。

有什么建议吗?

您需要将 JSON 读取为 Map<String, Object> 并创建一个包含标题和值字段的 Row object。之后,您需要遍历地图中的条目以区分地图和地图列表。对于地图,这些需要转换为行 object 并添加到行 object 的 collection 中。对于地图列表,同样的事情需要在内循环中完成。迭代完成后,需要将行添加到包装器 object,然后可以使用 XmlMapper 将其转换为 xml。

我创建了一个适用于您的示例的要点: https://gist.github.com/santmatthew/8f85399ad86fb45fec0be0c5df1a9825