JavaScript / 将 JSON 转换为 CSV

3
如何将一个json对象数组转换成csv格式?
例如:
[{ name: "Item 1", color: "Green", size: "X-Large" },
 { name: "Item 2", color: "Green", size: "X-Large" },
 { name: "Item 3", color: "Green", size: "X-Large" }];
给予
name;color;size
Item 1;Green;X-Large
Item 2;Green;X-Large
Item 3;Green;X-Large

可能是重复的问题:如何将JSON转换为CSV格式并存储在变量中 - jcubic
1
在我的函数中,我已经添加了标题并支持日期格式。 - Farandole
3个回答

5

JSFiddle示例:http://jsfiddle.net/FLR4v/

依赖项:

该函数

 /**
 * Return a CSV string from an array of json object
 *
 * @method JSONtoCSV
 * @param {Object} jsonArray an array of json object
 * @param {String} [delimiter=;] delimiter
 * @param {String} [dateFormat=ISO] dateFormat if a date is detected
 * @return {String} Returns the CSV string
**/
function JSONtoCSV(jsonArray, delimiter, dateFormat){
    dateFormat = dateFormat || 'YYYY-MM-DDTHH:mm:ss Z'; // ISO
    delimiter = delimiter || ';' ;

    var body = '';
    // En tete
    var keys = _.map(jsonArray[0], function(num, key){ return key; });
    body += keys.join(delimiter) + '\r\n';
    // Data
    for(var i=0; i<jsonArray.length; i++){
        var item = jsonArray[i];
        for(var j=0; j<keys.length; j++){
            var obj = item[keys[j]] ;
            if (_.isDate(obj)) {                
                body += moment(obj).format(dateFormat) ;
            } else {
                body += obj ;
            }

            if (j < keys.length-1) { 
                body += delimiter; 
            }
        }
        body += '\r\n';
    }

    return body;
}

这不处理包含分隔符或转义值(如果包含在引号中)的字符串。如果您知道您的数据不包含它,那就足够了。 - Risadinha

1
尽管这是一个相当老的问题,但我将我的发现保存在此处以供未来的研究人员使用。
Javascript现在提供了Object.values功能,可以将json的所有值提取到数组中,然后使用join将其转换为csv。
var csvrecord = Object.keys(jsonarray[0]).join(',') + '\n'; 
jsonarray.forEach(function(jsonrecord) {
   csvrecord += Object.values(jsonrecord).join(',') + '\n';
});

唯一的限制是它仍然不被一些浏览器支持。


这仅适用于您的对象是“简单”的情况。如果您的JSON记录包含日期时间对象或奇怪的对象,那么object.values将会写入什么内容。 - Farandole

-2
function getCSVFromJson(k)
{
var retVal=[];
k.forEach(function(a){
var s=''; 
for(k in a){
    s+=a[k]+';';
}   

retVal.push(s.substring(0,s.length-1));
});
return retVal;
}

最好能解释一下 为什么 你的代码可以解决这个问题。请参考 [答案]。 - brasofilo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接