多层JSON对象到CSV转换

时间:2016-09-26 08:55:59

标签: javascript angularjs json csv

我正在尝试在javascript中将JSON对象转换为CSV文件。

我已经使用了各种库和预制函数,但是一旦JSON开始嵌套,似乎没有什么对我有用。

这是我正在使用的功能之一:

function ConvertToCSV(objArray) {
        var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
        var str = '';

        for (var i = 0; i < array.length; i++) {
            var line = '';
            for (var index in array[i]) {
                if (line != '') line += ','

                line += array[i][index];
            }

            str += line + '\r\n';
        }

        return str;
    }

我看到有人说json对象的复杂性不应该影响你的输出,但我得到的只有:[object Object],[object Object],[object Object]等。

在线你可以找到json到csv转换器,如果属性是双嵌套的话,它实际上可以创建一个带有额外标题的完美csv文件。 因此,我将如何编写像这样的函数的正确方向的任何提示将非常感激。如果你知道任何可以做到这一点的图书馆也会很棒!

(可能值得一提的是,当我使用单层json对象时,csv文件不会显示[object,Object],而是给我一个不错的csv文件,它只在它开始嵌套时才会显示它不再工作了)

更新:根据要求,这是我正在使用的那种JSON文件。

[
{
"HEADER": {
    "SEARCH": "Zoeken",
    "FILTER": "Filter",
    "MISC": "Overige"
},
   "FORM": {
    "REQUIRED": "Dit veld is verplicht",
    "MINLENGTH": "De input is te kort",
    "MAXLENGTH": "De input is te lang",
    "EMAIL": "Geen geldig e-mailadres"
},
"TODO": "TODO: Hier moet nog een leuke tekst komen! dit komt uit een vertaling, in dit geval Nederlands. Nu is Nederlands natuurlijk op dit moment de enige taal maar het zou mooi zijn als hier in de toekomst veer vertalingen bij komen..."
}
 ]

我还想补充一点,当我使用'agnes.js'时,我不会将[Object object]作为输出,而是每个字母都添加在彼此之下并且不超过1列。

1 个答案:

答案 0 :(得分:0)

TRIVIAL SOLUTION

function ConvertToCSV(objArray) {
    var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
    var str = '';

    for (var i = 0; i < array.length; i++) {
        var line = '';
        for (var index in array[i]) {
            if (line != '') line += ',';

            // If array[i][index] is an object then we loop over its properties
            // And add it to the CSV string in a similar manner
            if (typeof array[i][index] === 'object') {
                var inner_obj = array[i][index];

                for (var index1 in inner_obj) {
                    if (line != '') line += ','

                    line += '"' + inner_obj[index1] + '"';
                }
            } else {
                line += '"' + array[i][index] + '"';
            }
        }

        str += line + '\r\n';
    }
    return str;
}

<强>说明

由于对象结构将保持一致,我所做的是运行if-else检查以查看array[i][index]是否为对象。如果它是一个对象,那么我们只需在其属性上运行一个循环,然后像以前一样将它添加到CSV字符串中。

另外,我在所有元素周围放置了引号,以便,的字符串不会被误解为CSV的元素分隔符。