JSON到CSV转换(JavaScript):如何正确格式化CSV转换
我想将JSON响应转换为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 | +-------+-------+-----
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++]