如何使用node.js访问json对象的子元素

在我的node.js应用程序中,我从mongodb服务器中检索值,并希望将它们转换为CSV文件。父元素很容易从数据库访问并显示在CSV文件中,但子元素不显示,无法访问..

JSON结构:

"name" : "fhj", "age" : "23", "gender" : "female", "sec" : "b", "username" : "9886666", "language" : "HINDI", "method" : "method2", "timeSlot" : { "id" : 2, "fromTime" : 12, "toTime" : 15 } 

mycode的:

 db.users.find(function(err,values){ if(err||!values.length) console.log("ERROR !!!!"); else { var i=1; str='['; values.forEach(function(user){ if(i==values.length) str=str+'{ "name" : "' + user.username + '","age" : "'+ user.age +'","gender":"'+user.gender+'","sec":"'+user.sec+'","username":"'+user.username+'","language":"'+user.language+'","method":"'+user.method+'","Timeslot":"'+user.timeslot+'"}'; else{ str = str + '{ "name" : "' + user.username + '","age" : "'+ user.age +'","gender":"'+user.gender+'","sec":"'+user.sec+'","username":"'+user.username+'","language":"'+user.language+'","method":"'+user.method+'","Timeslot":"'+user.timeslot+'"},' +'\n'; i++; } }); str = str.trim(); str = str + ']'; var obj=JSON.parse(str); json2csv({data: obj, fields: ['name', 'age','gender','sec','username','language','method','Timeslot']}, function(err, csv) { if (err) console.log(err); fs.writeFile('./files/user.csv', csv, function(err) { if (err) throw err; console.log('File saved'); }); }); } }); 

除了时隙的子元素之外,所有的值都被显示出来。 如何从数据库访问JSON的子元素,并显示CSV文件中的所有值?

访问嵌套元素的简单方法可以在下面的线程 ( 访问嵌套数据结构 )的答案中find。

嵌套数据结构是引用其他数组或对象的数组或对象,即其值是数组或对象。 这样的结构可以通过连续应用点或括号来访问。

正如我们所看到的,timeSlot是一个对象,因此我们可以使用点符号来访问它的属性。 items属性的访问方式如下:

 timeSlot.id 

或者,我们可以使用任何属性的括号表示法,特别是如果名称中包含的字符会使点符号的用法无效:

 var item_name = timeSlot['id']; 

一旦你有所有你需要的数据,创buildCSV文件应该是相当简单的:)

尝试如下

  db.users.find(function(err, users){ if (err || !users.length) return console.log(err || 'Users not found'); // List of column to export to cvs var columns = ['name', 'age', 'gender', 'sec', 'username', 'language', 'method', 'timeSlot']; var text = users.reduce(function(text, user){ // user is object eg {name : "fhj", age : "23", .. } // If user is json then `user = JSON.parse(user, columns);` // convert user to csv-line text += columns.reduce(function(line, col){ // I'm don't know how timeSlot must be save => save as json line += (type user[col] == 'object') ? JSON.stringify(user[col], ['id', 'fromTime', 'toTime']) : user[col]; line += ';'; return line; }, '') + '\n'; return text; }, ''); fs.writeFile('./files/user.csv', text, function(err) { if (err) throw err; console.log('File saved'); }); }); 

尝试使用user.timeslot.fromTime &&为每个子元素创build一个键/值

像这样尝试。 这将合并来自timeSlot对象的所有数据到单个string中。 您可以尽可能多地格式化该string。 代码添加forEach循环。

 var strToAdd = ""; for (var k in timeSlot) { strToAdd += k + timeSlot[k] + "->"; } ...+"Timeslot":"'+strToAdd+'".... 

希望这可以帮助。

看来问题是,在你的forEach循环中,你正在访问variablesvalues你访问的是user的属性timeslot ,而不是usertimeSlot值。 记住大小写敏感性问题

这是一个小提琴,它演示了改变第24行和第25行中的对象属性的大小写解决了这个问题

在链接的例子中,我也将对象串化,以便我可以将它写入文档并清楚地看到输出。 我会build议,因为你可能会遇到问题parsing它。 相反,你应该通过访问该对象的属性构造一个string。

无论如何,你有一个错误的原因是你的原代码中的大小写敏感问题。 我希望这有帮助。

当你读取结构化数据(这里是:JSON)并且想把它转换成平坦数据(这里是:csv)时,你必须决定如何执行展平。

换句话说 – 您的csv目标结构可能如下:

 name, age, gender, sec, username, language, method, timeSlot_id, timeSlot_fromTime, timeSlot_toTime "fhb","23","female","b","9886666","HINDI","method2",2,12,15 

一旦你决定这种方法来平滑timeSlot中给出的结构,你可以使用@Aikon Mokwai的评论,而不需要stringify – 使用@trolologuy描述的数组符号来读取结构:

 var timeSlot_id = timeSlot['id]'; var timeSlot_fromTime = timeSlot['fromTime']; var timeSlot_toTime = timeSlot['toTime']; 

随后,读取csv的人必须明白,您将数据展平,但不必parsing任何结构,因为您确实提供了平面数据logging(因为csv最喜欢)。

希望能帮助到你!

您好使用asynchronousforeach循环来实现以上。 这里详细介绍它是如何工作的。

asynchronous循环在nodejs中

 var json= { "name" : "fhj", "age" : "23", "gender" : "female", "sec" : "b", "username" : "9886666", "language" : "HINDI", "method" : "method2", "timeSlot" : { "id" : 2, "fromTime" : 12, "toTime" : 15 } }; console.log(json.timeSlot['id']); console.log(json.timeSlot['fromTime']); console.log(json.timeSlot['toTime']); 

请享用 :)

见jsfiddle