JavaJackson使用特定的xml数组格式将大型JSON解析为XML

6ljaweal  于 2023-02-20  发布在  Java
关注(0)|答案(1)|浏览(210)

帮我弄清楚如何用Jacson库把Jason节点转换成xml。我的JSON很大(从10到200 mb),包含了很多对象。所以我不能通过类转换并使用@JacksonXmlProperty(localName = "someName")。这是因为这个json有很多动态元素。问题是xml中数组的格式应该是:

<test_data>
     <data_type>numeric</data_type>
     <value>
         <Item>0</Item>
         <Item>1</Item>
     </value>
</test_data>

and jason element looks like this:
{
     "test_data": {
         "data_type": "numeric",
         "value": [
             0,
             1
         ]
     }
}

如果我们使用这个xml并像这样转换它:

public static void main(String[] args) throws IOException {
        String xmlStr = """
          <test_data>
            <data_type>numeric</data_type>
            <value>
              <Item>0</Item>
              <Item>1</Item>
            </value>
          </test_data>
            """;
        
        XmlMapper xmlMapper = new XmlMapper();
        JsonNode xml = xmlMapper.readTree(xmlStr);
        ObjectMapper jsonMapper = new JsonMapper();
        System.out.println(jsonMapper.writeValueAsString(xml));
    }

输出为:

{"data_type":"numeric","value":{"Item":["0","1"]}}

反之亦然:

String jsonStr = """
            {
                "test_data" : {
                          "data_type" : "numeric",
                          "value" : [ 0, 1 ]
                        }
            }
            """;

        ObjectMapper jsonMapper = new JsonMapper();
        JsonNode node = jsonMapper.readTree(jsonStr.getBytes());
        XmlMapper xmlMapper = new XmlMapper();
        xmlMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
        String xml = xmlMapper.writeValueAsString(node);
        System.out.println(xml);

输出:

<ObjectNode>
  <test_data>
    <data_type>numeric</data_type>
    <value>0</value>
    <value>1</value>
  </test_data>
</ObjectNode>

简单地说,我有JsonNode,我需要特定数组格式的xml String,有什么想法吗?
尝试找到为JsonNode创建JsonSerializer的方法,但失败。

qjp7pelc

qjp7pelc1#

我没有找到在XmlMapper端执行此操作的方法,所以我只是修改了一个输入json。用名称为“value”的对象替换名称为“value”的所有数组,并将数组的项复制到名称为“Item”的新数组。代码示例如下所示:

private void changeArrayToObject(JsonNode node) {
        if (node.isObject()) {
            ObjectNode objectNode = (ObjectNode) node;
            Iterator<Map.Entry<String, JsonNode>> iter = objectNode.fields();
            while (iter.hasNext()) {
                Map.Entry<String, JsonNode> entry = iter.next();
                if (entry.getKey() == "value" && entry.getValue().isArray()) {
                    ArrayNode arrayNode = (ArrayNode) entry.getValue();
                    ObjectNode newObject = new ObjectNode(new JsonNodeFactory(true));
                    entry.setValue(newObject.set("Item", arrayNode));
                    if(isArrayValueObjOrNot(arrayNode)) {
                        for (JsonNode nextNode : arrayNode) {
                            changeArrayToObject(nextNode);
                        }
                    }
                } else {
                    changeArrayToObject(entry.getValue());
                }
            }
        }
    }

    private Boolean isArrayValueObjOrNot(ArrayNode arrayNode) {
        JsonNode firstElement = arrayNode.get(0);
        if (firstElement.isObject())
            return true;
        return false;
    }

相关问题