在 JavaScript 中将 JSON 对象转换为 CSV 格式

Posted

技术标签:

【中文标题】在 JavaScript 中将 JSON 对象转换为 CSV 格式【英文标题】:Converting JSON object to CSV format in JavaScript 【发布时间】:2012-06-30 16:57:04 【问题描述】:

我正在尝试将 javascript 对象集转换为 CSV 格式

你可以了解我的 Javascript 对象,如果你把它放在在线 JSON 解析器https://jsonformatter.org/json-parser

这就是我尝试解决的方法...但失败了..http://jsfiddle.net/fHQzC/11/

我正在尝试将与值“术语”和相应标题对应的整个值转换为 CSV 格式

预期的输出是这样的

Time,Dec 9, 2012 
News,Germany,election, Egypt,Revolution, Japan, Earthquake
Person,Obama, Beckham
Title,Pearce Snubs Beckham                                
Time,Dec 5, Birthday
Person, Lebron James
News,Italy,Euro 2012 Final
Title-Heats National Champions
                              

是否可以在 Excel 表格中下载 csv 文件,我在 *** 中找到的那个文件对我没有用...

【问题讨论】:

我猜你已经检查过***.com/questions/4130849/… 但这对你不起作用? 【参考方案1】:

你可以试试

$(document).ready(function () 

        // Create Object
        var items = [
               name: "Item 1", color: "Green", size: "X-Large" ,
               name: "Item 2", color: "Green", size: "X-Large" ,
               name: "Item 3", color: "Green", size: "X-Large" ];

        // Convert Object to JSON
        var jsonObject = JSON.stringify(items);

        // Display JSON
        $('#json').text(jsonObject);

        // Convert JSON to CSV & Display CSV
        $('#csv').text(ConvertToCSV(jsonObject));
    );

还有一个函数 ConvertToCSV

// JSON to CSV Converter
        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;
        

Source

【讨论】:

复杂性不会影响这一点,因为 csv 的格式将始终保持不变.. 你检查过***.com/questions/4130849/… 吗? 这会在值中包含逗号吗? json 是逗号分隔值,它不会将逗号视为值。你需要为此使用一些技巧。 这应该扩展为符合 RFC4180,特别是用双引号括起来可能包含逗号或换行符的字符串,并转义任何嵌入的双引号。见json2csv【参考方案2】:

可能更优雅和最简单的解决方案

function convertToCSV(arr) 
  const array = [Object.keys(arr[0])].concat(arr)

  return array.map(it => 
    return Object.values(it).toString()
  ).join('\n')



console.log(
  convertToCSV(
    [
      
        id: 1,
        name: 'Foo',
        timestamp: new Date()
      ,
      
        id: 2,
        name: 'Bar',
        timestamp: new Date()
      ,
      
        id: 3,
        name: 'Baz',
        timestamp: new Date()
      
    ]
  )
)

【讨论】:

谢谢,这正是我需要的解决方案。我相信这是最好的答案。 这正是我想要的 完美解决方案!【参考方案3】:

这是我的解决方案

function arrayToCSV(objArray) 
     const array = typeof objArray !== 'object' ? JSON.parse(objArray) : objArray;
     let str = `$Object.keys(array[0]).map(value => `"$value"`).join(",")` + '\r\n';

     return array.reduce((str, next) => 
         str += `$Object.values(next).map(value => `"$value"`).join(",")` + '\r\n';
         return str;
        , str);
 

例子:

let arr = [name: "Essa", age: 25];
console.log(arrayToCSV(arr));

【讨论】:

这会转义列内的逗号分隔值 @RisingSun 不,它没有【参考方案4】:

这是一个类似于mightybruno 的答案的解决方案,它处理包含逗号的字符串。其他答案似乎都没有考虑到这一点。

function objectsToCSV(arr) 
    const array = [Object.keys(arr[0])].concat(arr)
    return array.map(row => 
        return Object.values(row).map(value => 
            return typeof value === 'string' ? JSON.stringify(value) : value
        ).toString()
    ).join('\n')

【讨论】:

非常感谢,我也看到很多答案没有考虑包含逗号的字符串。【参考方案5】:

以下代码会将 JSON 数组转换并下载为 csv 文件。

 function exportJSONToCSV(objArray) 
    var arr = typeof objArray !== 'object' ? JSON.parse(objArray) : objArray;
    var str =
      `$Object.keys(arr[0])
        .map((value) => `"$value"`)
        .join(',')` + '\r\n';
    var csvContent = arr.reduce((st, next) => 
      st +=
        `$Object.values(next)
          .map((value) => `"$value"`)
          .join(',')` + '\r\n';
      return st;
    , str);
    var element = document.createElement('a');
    element.href = 'data:text/csv;charset=utf-8,' + encodeURI(csvContent);
    element.target = '_blank';
    element.download = 'export.csv';
    element.click();
  

【讨论】:

【参考方案6】:

这是一个快速而肮脏的方法,但可能适用于大多数情况:

const headers = Object.keys(objAry[0])
console.log(headers.join())

objAry.forEach(r => console.log(
   Object.values(r)
   .map(c => Array.isArray(c)? `"$c.join()"` : c)
   .join())
)

【讨论】:

【参考方案7】:

这是我的解决方案

https://jsfiddle.net/dhou6y3o/

function iterateObject(obj) 
  var value = '', header = '';
          for (name in obj) 
            if (obj.hasOwnProperty(name)) 
              if (isObject(obj[name])) 
                var out = iterateObject(obj[name]);
                value += out.value;
                header += out.header;
               else 
                value += removeNewLine(obj[name]) + '; ';
                header += name + '; ';
              
            
          
  return 
    "value":value,
    "header":header
  ;

function isObject(obj) 
  return (typeof obj === 'object');

function removeNewLine(item) 
  return item.toString().replace(/(\r\n|\n|\r)/gm,"");

【讨论】:

【参考方案8】:

使用 papaparse 库将 JSON 转换为 CSV,反之亦然。 参考这个链接-https://www.papaparse.com/

【讨论】:

【参考方案9】:

类似于mightybruno 的回答,但如果需要,这将允许单独访问标题和内容(通过将join 语句移到函数的后面)。

function objToCsv(data) 
    const headers = Object.keys(data[0]).join();
    const content = data.map(r => Object.values(r).join());
    return [headers].concat(content).join("\n");

【讨论】:

【参考方案10】:
    function objToCsv(arr) 
        let claves = Object.keys(arr[0]).sort();
        let rows = claves.join(";") + "\r\n";
        arr.forEach((row) => 
          let nrow = [];
          claves.forEach((clave) => 
            let valor = JSON.stringify(row[clave]);
            nrow.push(valor.split(";").join(" ").split(",").join(" "));
          );
          rows = rows + nrow.join(";") + "\r\n";
        );
        return rows;
    

【讨论】:

欢迎来到 ***。虽然此代码可能会回答问题,但提供有关 如何 和/或 为什么 解决问题的附加上下文将提高​​答案的长期价值。

以上是关于在 JavaScript 中将 JSON 对象转换为 CSV 格式的主要内容,如果未能解决你的问题,请参考以下文章

在Javascript中将JSON字符串转换为JSON对象数组

在 Javascript 中将 Map 转换为 JSON 对象

如何在 Javascript 中将表单数组转换为 JSON? (对象数组)?

在 Javascript 中将 JSON 转换为 HTML

当字符串在双引号内有单引号时,如何在Javascript中将此字符串转换为JSON对象

在Javascript中将数组转换为嵌套的JSON?