繁体   English   中英

在Java中将Json动态转换为CSV。 寻找适用于任何json的通用代码,无论json文件中有多少个节点

[英]Dynamic Json to CSV in java. looking for Generic code that works with any json, irrespective of any number of node in json file

嗨,我需要将所有json元素转换为csv。 json是动态文件,字段数和名称将在文件之间变化。 我尝试了不同的方法,但大多数情况下,我需要在脚本中提及字段名称才能将数据提取到csv中

JSON文件

[
    {
        "system": "Application",
        "id": "12345",
        "version": 1,
        "event": "NEW",
        "keywords": {
            "ProductType": "ALL",
            "Business": "USA",
        },
        "product": {
            "type": "INS",
            "startDate": 20190102,
            "endDate": 20190104,
            "cash": 100000.00,
            "sub": {
                "type": "Life",
                "productId": 987,
                "maturityDate": 20260421,               
            },
            "paymentCalendar": [
                "Monthly"
            ],
            "duration": "20Y",
            "Amount": 1000.00,
            "cashFlows": [
                {
                    "startDate": 20190102,
                    "endDate": 20190104,
                    "paymentDate": 20190104,
                }
            ],
            "principalFlows": [
                {
                    "startDate": 20190102,
                    "endDate": 20190104,
                    "paymentDate": 20190102,
                    "currency": "USA",
                    "amount": 400.0
                },
                {
                    "startDate": 20190104,
                    "endDate": 20190104,
                    "paymentDate": 20190104,
                    "currency": "USA",
                    "amount": 600.0
                }
            ]
        },
        "EventDate": 20190108,
        "maturityDate": 20190104
    }
]

以上字段不是恒定的,所有字段都会不断变化。

预期输出低于

在此处输入图片说明

使用Jackson ObjectMapperApache Commons CSV,您可以通过读取JSON然后访问所有节点来实现所需的功能。

  1. 如果该节点是集合,则访问其所有子项,并将字段或数组索引附加到前缀之后
    • 请注意,数组和对象需要独立处理
  2. 如果该节点不是集合,则将其添加到CSV输出中
    public void jsonToCsv(String json, Appendable appendable) throws IOException {
        JsonNode root = new ObjectMapper().reader().readTree(json);
        CSVPrinter printer = CSVFormat.DEFAULT.print(appendable);
        appendNode(root.get(0), "", printer);
    }

    private void appendNode(JsonNode node, String prefix, CSVPrinter printer) throws IOException {
        if (node.isArray()) {
            for (int i = 0; i < node.size(); ++i) {
                appendNode(node.get(i), String.format("%s/%d", prefix, i), printer);
            }
        } else if (node.isContainerNode()) {
            Iterator<Map.Entry<String, JsonNode>> fields = node.fields();
            while (fields.hasNext()) {
                Map.Entry<String, JsonNode> field = fields.next();
                appendNode(field.getValue(), String.format("%s/%s", prefix, field.getKey()), printer);
            }
        } else {
            printer.printRecord(prefix.substring(1), node.asText());
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM