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

时间:2014-12-08 09:42:16

标签: json node.js csv

在我的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文件中的所有值???

8 个答案:

答案 0 :(得分:2)

可以在following thread访问嵌套数据结构)的答案中找到访问嵌套元素的简便方法。

  

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

     

我们可以看到timeSlot是一个对象,因此我们可以使用点表示法访问它的属性。可以按如下方式访问items属性:

timeSlot.id
  

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

var item_name = timeSlot['id'];

获得所需的所有数据后,CSV文件的创建应该非常简单:)

答案 1 :(得分:1)

尝试以下

    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 e.g. {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');
        });
    });

答案 2 :(得分:0)

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

答案 3 :(得分:0)

试试这样。这会将timeSlot对象中的所有数据合并为单个字符串。您可以根据需要格式化该字符串。代码添加forEach循环。

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

...+"Timeslot":"'+strToAdd+'"....

希望这有帮助。

答案 4 :(得分:0)

似乎问题在于,在您正在迭代变量values的forEach循环中,您正在访问timeslot的属性user,而不是值timeSlot user。记住区分大小写很重要!

Here is a fiddle which demonstrates that changing the case of the object property in lines 24 and 25 solves the issue

在链接的示例中,我也在对该对象进行字符串化,以便我可以将其写入文档并清楚地看到输出。我建议不要这样做,因为你可能会遇到稍后解析它的问题。相反,您应该通过访问该对象的属性来构造一个字符串。

无论如何,您遇到错误的原因是原始代码中的区分大小写问题。我希望这有帮助。

答案 5 :(得分:0)

当您阅读结构化数据(此处为: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都必须明白你弄平了数据,但不必解析任何结构,因为你真的提供了平坦的数据记录(正如csv最喜欢的那样)。

希望它有所帮助!

答案 6 :(得分:0)

您可以使用异步foreach循环来实现上述功能。以下是它的工作原理。

Async loop in nodejs

答案 7 :(得分:0)

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