JSON到CSV转换(JavaScript):如何正确格式化CSV转换

JSON到CSV转换(JavaScript):如何正确格式化CSV转换,javascript,json,csv,Javascript,Json,Csv,我想将JSON响应转换为CSV格式。我能够找出如何正确地生成头,方法是将键的父项附加在一起以生成正确的头。我遇到的问题是构造与每行对应的数据。例如,假设我的这些列名为id,tags,和friends\u id。以id=1,tags=[car,plane]friends\u id=[0,1,2]为例。在csv表格格式中应该是这样的 +-------+-------+------------+ | id | tags | friends_id | +-------+-------+-----

我想将JSON响应转换为CSV格式。我能够找出如何正确地生成头,方法是将键的父项附加在一起以生成正确的头。我遇到的问题是构造与每行对应的数据。例如,假设我的这些列名为
id
tags
,和
friends\u id
。以
id=1,tags=[car,plane]friends\u id=[0,1,2]
为例。在csv表格格式中应该是这样的

+-------+-------+------------+
| id    | tags  | friends_id |
+-------+-------+------------+
| 1     | car   | 0          |
+-------+-------+------------+
| empty | plane | 1          |
+-------+-------+------------+
| empty | empty | 2          |
+-------+-------+------------+
| 2     | ...   | ...        |
+-------+-------+------------+
这是我正在研究的一些测试数据

{
    "_id": "5cfe7d3c6deeeef08ce0444b",
    "name": "Debra Milligain",
    "phone": "+1 (906) 432-2182",
    "address": "676 Merit Court, Steinhatchee, Oregon, 5491",
    "tags": [
        "consequat",
        "reprehenderit",
        "amet"
    ],
    "Work": {
        "skills": [{
                "id": 0,
                "name": "Programming"
            },
            {
                "id": 1,
                "name": "Business"
            }
        ]
    },
    "friends": [{
            "id": 0,
            "name": "Stafford Hernandez"
        },
        {
            "id": 1,
            "name": "Colleen Christensen"
        },
        {
            "id": 2,
            "name": "Barker Keith"
        }
    ],
    "greeting": [],
    "favoriteFruit": "banana"
}
下面的代码(这是我之前发现的一个问题的解决方案)是我用来递归地将头生成到映射或哈希表中并附加其相应值的代码

var arrayOfHeaders = {};
var headerDirectory = "";
var rootLevel = true;
var temp = ""
var firstWalkthrough = true;
function traverseJSON(obj){
    for (var o in obj) {
        if (typeof obj[o] == "object") {
            //console.log("Before traversal ", o)
            //console.log("Traversing the object: ", obj[o])
            if(!isNaN(o)){
                //console.log("Current position is a number ", o)
            }else{
                console.log("Adding to directory... " , o)
                headerDirectory += (headerDirectory == "") ? o : "_" + o;
            }
            rootLevel = false;
            if (firstWalkthrough){
                firstWalkthrough = false;
                //if (o == 0) 
                rootLevel = true;
            }

            traverseJSON(obj[o]);
            rootLevel = true;
            temp = headerDirectory;
            headerDirectory = "";
        } else {
            if (rootLevel) {
                if(isNaN(o)){ 
                    headerDirectory = "";
                    //console.log("Has value and is root ", o, "and temp ", temp)
                    arrayOfHeaders[o] +=  ",\"" + obj[o] + "\"";
                }else{
                    arrayOfHeaders[headerDirectory+"_"+o] +=  ",\"" + obj[o] + "\"";
                }

            }
            else {
                //console.log("Has value and is not root ", o)
                //console.log("Current Header Directory " + headerDirectory)
                //console.log("Saved temp : ", temp)
                if(isNaN(o)){ 
                    if(headerDirectory == "") headerDirectory = temp; 
                    //arrayOfHeaders.push(headerDirectory + "_" + o)
                    arrayOfHeaders[headerDirectory + "_" + o] += ",\"" + obj[o] + "\"";
                }              
            }
        }
    }
    // console.log("Array of Headers : ", arrayOfHeaders)
}
这是arrayofHeaders的实际响应:

{ _id: 'undefined,"5cfe7d3c6deeeef08ce0444b"',
  name: 'undefined,"Debra Milligain"',
  phone: 'undefined,"+1 (906) 432-2182"',
  address: 'undefined,"676 Merit Court, Steinhatchee, Oregon, 5491"',
  tags_0: 'undefined,"consequat"',
  tags_1: 'undefined,"reprehenderit"',
  tags_2: 'undefined,"amet"',
  'Work_skills_id-skill': 'undefined,"0","Business"',
  'Work_skills_name-skill': 'undefined,"Programming"',
  'friends_id-friends': 'undefined,"0","1","2"',
  'friends_name-friends':
   'undefined,"Stafford Hernandez","Colleen Christensen","Barker Keith"',
  favoriteFruit: 'undefined,"banana"' }
我想以这样一种方式构建数据,这样可以很容易地循环并生成这样的csv。问题是我不确定如何从上面的内容跳到下面的内容

+--------------------------+-----------------+-------------------+---------------------------------------------+---------------+------------------------+--------------------------+---------------------+-----------------------+---------------+
| _id                      | name            | phone             | address                                     | tags          | Work__skills__id-skill | Work__skills__name-skill | friends__id-friends | friends__name-friends | favoriteFruit |
+--------------------------+-----------------+-------------------+---------------------------------------------+---------------+------------------------+--------------------------+---------------------+-----------------------+---------------+
| 5cfe7d3c6deeeef08ce0444b | Debra Milligain | +1 (906) 432-2182 | 676 Merit Court, Steinhatchee, Oregon, 5491 | consequat     | 0                      | Programming              | 0                   | Stafford Hernandez    | banana        |
+--------------------------+-----------------+-------------------+---------------------------------------------+---------------+------------------------+--------------------------+---------------------+-----------------------+---------------+
|                          |                 |                   |                                             | reprehenderit | Business               |                          | 1                   | Colleen Christensen   |               |
+--------------------------+-----------------+-------------------+---------------------------------------------+---------------+------------------------+--------------------------+---------------------+-----------------------+---------------+
|                          |                 |                   |                                             | amet          |                        |                          | 2                   | Barker Keith          |               |
+--------------------------+-----------------+-------------------+---------------------------------------------+---------------+------------------------+--------------------------+---------------------+-----------------------+---------------+
编辑:El Tom-可能修复您的代码
var arrayOfHeaders={};
var headerDirectory=“”;
var rootLevel=true;
var temp=“”
var firstWalkthrough=true;
特拉弗雷杰森(
JSON.parse({u id:“5cfe7d3c6deeeef08ce0444b”,“name:“Debra miligain”,“phone:”+1(906)432-2182”,“address:“676美德法庭,俄勒冈州斯坦哈奇,5491”,“tags:[“consequat”,“reprehenderit”,“amet”],“Work:{“skills:[{”id:“0”,“name:“Programming”},{id:“name:“Business”},{”id:“friends:“friends:{”id:“0”,“name:“name:“Stafford Hernandez”},{,“姓名”:“Colleen Christensen”},{“id”:2,“姓名”:“Barker Keith”}],“问候语”:[],“favoriteFruit”:“香蕉”}
)
函数遍历JSON(obj){
用于(obj中的var o){
if(对象类型[o]=“对象”){
//log(“遍历前”,o)
//log(“遍历对象:”,obj[o])
如果(!isNaN(o)){
//console.log(“当前位置是一个数字”,o)
}否则{
log(“添加到目录…”,o)
headerDirectory+=(headerDirectory==”)?o:“”+o;
}
rootLevel=false;
如果(第一次演练){
firstWalkthrough=false;
//如果(o==0)
rootLevel=true;
}
traverseJSON(obj[o]);
rootLevel=true;
temp=headerDirectory;
校长任期=”;
}否则{
if(根级别){
if(isNaN(o)){
校长任期=”;
//log(“有值,是根”,o,“和temp”,temp)
if(arrayOfHeaders[o]!==未定义){
arrayOfHeaders[o].push(对象[o]);
}否则{
阵列头[o]=[obj[o]];
}
}否则{
if(arrayOfHeaders[headerDirectory+“”+o]!==未定义){
arrayOfHeaders[headerDirectory+“”+o].push(obj[o]);
}否则{
arrayOfHeaders[headerDirectory+“”+o]=[obj[o];
}
}
}
否则{
//log(“有值且不是根”,o)
//log(“当前头目录”+头目录)
//日志(“保存的温度:”,温度)
if(isNaN(o)){
如果(headerDirectory==“”)headerDirectory=temp;
//arrayOfHeaders.push(headerDirectory+“u”+o)
if(arrayOfHeaders[headerDirectory+“”+o]!==未定义){
arrayOfHeaders[headerDirectory+“”+o].push(obj[o]);
}否则{
arrayOfHeaders[headerDirectory+“”+o]=[obj[o];
}
}
}
}
}
}
var res=JSON.stringify(arrayOfHeaders)。替换(/,“/g,,\n“)
log(“JSON.stringify:\n”,res打印的数组中更简单的数组)
res={
“_id”:[“5CFE7D3C6DEEEF08CE0444B”],
“名称”:[“Debra Milligain”],
“电话”:[“+1(906)432-2182”],
“地址”:[“676案情法庭,俄勒冈州斯坦哈奇,5491”],
“标记0”:[“consequat”],
“标签1”:[“reprehenderit”],
“标记2”:[“amet”],
“工作技能id”:[0,1],
“工作技能名称”:[“编程”,
“业务”],
“好友id”:[0,1,2],
“朋友的名字”:[“斯塔福德·埃尔南德斯”,
“科琳·克里斯滕森”,
“巴克·基思”],
“最喜欢的水果”:[“香蕉”]
};
var yourResult=“”;
对于(arrayOfHeaders中的var i){
if(arrayOfHeaders[i].长度>1){
arrayOfHeaders[i]='''''''+arrayOfHeaders[i].连接(''',“')+'';
}否则{
arrayOfHeaders[i]='“'+arrayOfHeaders[i]+'”;
}
yourResult+=i+':'+arrayOfHeaders[i]+'\n';
}
console.log(“\n可能是您想要收集的结果,但JSON格式无效:\n”,yourResult);
是这样的(必须运行代码段才能将结果作为HTML表演示-不知道如何直接放在这里)

函数读取(headName、arr、outRows){
var低于=[headName];
而(arr.toString().indexOf(“[object”)==0
||数组。isArray(arr)){
var hasArray=false;
用于(arr中的var i){
if(arr[i].toString().indexOf(“[object”)==0
||isArray(arr[i])hasArray=true;
}
if(hasArray){
用于(arr中的var i)
if(arr[i].toString().indexOf(“[object”)==0
||Array.isArray(arr[i])){
[0]+='\'+i下的if(isNaN(i));
读取(在[0]下,到达[i],出行);
if(arr.length==未定义)
return;//空关联(技能)
删除arr[i++]