在 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? (对象数组)?