【问题标题】:Multi-layered JSON object to CSV convertion多层 JSON 对象到 CSV 的转换
【发布时间】:2016-09-26 08:55:59
【问题描述】:

我正在尝试将 JSON 对象转换为 javascript 中的 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 列。

【问题讨论】:

  • 请添加您的对象的示例。
  • 我试过你的示例代码。我没有收到[object Object]
  • @NinaScholz 添加了我的 json 示例
  • @BlazeSahlzen 您的 json 是否也嵌套了?它也适用于我的示例 json 代码吗?
  • 它显然不适用于嵌套的 json。因为toString 方法总是为object 返回[object Object]。你可以把它串起来。

标签: javascript angularjs json csv


【解决方案1】:

简单的解决方案

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 的元素分隔符。

【讨论】:

  • 耶!至少我现在正在将值输入到 csv 文件中。但是只剩下一个问题。所有的标题都消失了,现在只有 1 行包含所有单独的标题。你知道如何添加这个吗?还是我的函数不是首先添加这些?我开始认为我应该删除嵌套并使其更简单。
  • 标题是指标题吗?不,您的函数不处理标题。
  • @MaxTaylor 如果它对你有帮助,你应该支持/接受这个答案。
猜你喜欢
  • 2021-12-19
  • 2013-07-16
  • 2020-03-06
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
相关资源
最近更新 更多