node.js读取文件,解析为JSON并输出

时间:2014-06-30 00:35:47

标签: json node.js sockets socket.io

我对任何与代码相关的东西都很陌生,但我的学习曲线缓慢而且有时很痛苦。

我有一个包含json的文件,我读到node.js解析并推送到web套接字。该脚本工作正常,但我只返回一个json对象。

devices.json :(完整文件)并非每个元素都具有相同的数据内容,并且数据源中有任意数量的元素对象。

{
   "element":"SENS01",
   "data":{
      "type":"SEN",
      "descr":"T100"
   },
   "element":"SENS02",
   "data":{
      "type":"SEN",
      "descr":"T088",
      "uid":"X1A1AA",
      "check_on":"2014/06/29"
   },
   "element":"SENS03",
   "data":{
      "type":"SEN",
      "descr":"T000:",
      "uid":"X1A1AB",
      "check_on":"2014/06/29"
   },
   "element":"LED1",
   "data":{
      "type":"LED",
      "state":"0"
   }
}

执行这些操作的代码是;

server.js:

    var app = require('http').createServer(handler),
    io = require('socket.io').listen(app),
    fs = require('fs');

// creating the server ( localhost:8000 )

app.listen(8000);

    // Server started - load page.

function handler(req, res) {
    fs.readFile('/var/www/html/dashboard.html', function (err, data) {
        if (err) {
            console.log(err);
            res.writeHead(500);
            return res.end('Error loading web page');
        }
        res.writeHead(200);
        res.end(data);
    });
}


// creating a new websocket.

io.sockets.on('connection', function (socket) {
    console.log();


// 1st READ of json state file.

    fs.readFile('devices.json', 'utf8', function (err, data) {
        if (err) throw err;

// Parse/check its valid json.

    var dump = JSON.parse(data);

            socket.volatile.emit('MAP.room1', dump);

    });
});

当我连接到套接字时,会发送以下内容(从服务器控制台记录)

  

debug - websocket writing 5 ::: {" name":" MAP.room1"," args":[{" element&#34 ;:" LED1""数据" {"类型":" LED""状态":&# 34; 0"}}]}

我从来没有得到任何其他对象,只有这一个。我已经了解了如何迭代对象,但这对我来说几乎毫无意义:(

我想要实现的是当你连接到web套接字时,devices.json文件中的每个对象一次被推出1个对象。所以一旦这个工作,我希望看到;

  

debug - websocket writing 5 ::: {" name":" MAP.room1"," args":[{" element&#34 ;:" LED1""数据" {"类型":" LED""状态":&# 34; 0"}}]}

     

debug - websocket writing 5 ::: {" name":" MAP.room1"," args":[{" element&#34 ;:" SENS03""数据" {"类型":" SEN"" DESCR":&# 34; T000:"" UID":" X1A1AB"" check_on":" 2014/06/29"}} ]等等......

如果我在server.js中添加console.log(data)行,那么我会按预期看到整个文件。只有一次被解析后,我就离开了1个条目。

任何人都可以解释一下发生了什么,以及我如何才能最好地解决这个问题。它需要以一种非常简单的方式理想地使用我自己的代码/数据集作为示例,这样我才能理解这对我来说意味着什么?我阅读的很多网页示例和内容都倾向于使用不同的例子,这些例子让我感到困惑。我知道声明变量等的基础知识,并且使用一个简单的脚本来解析从API收到的一些推送数据,但是对Ruby的使用非常有限。

如果您需要更多上下文等,请告诉我,否则感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

我认为您的问题是您在JSON中使用相同的密钥。当解析器读入该JSON时,它会不断覆盖elementdata的先前值,因为这些是唯一的唯一键名,这些是您看到的唯一两个值。

如果您修改了JSON,以便在相同的“级别”上不使用相同的键名,那么您将看到您期望的所有数据。这是一个可以轻松遍历每个元素的示例:

[
  {
   "element":"SENS01",
   "data":{
      "type":"SEN",
      "descr":"T100"
   }
  },
  {
   "element":"SENS02",
   "data":{
      "type":"SEN",
      "descr":"T088",
      "uid":"X1A1AA",
      "check_on":"2014/06/29"
   }
  },
  {
   "element":"SENS03",
   "data":{
      "type":"SEN",
      "descr":"T000:",
      "uid":"X1A1AB",
      "check_on":"2014/06/29"
   }
  },
  {
   "element":"LED1",
   "data":{
      "type":"LED",
      "state":"0"
   }
  }
]

或者,如果您可以保证element值始终是唯一的,那么也许您也可以这样做:

{
  "SENS01":{
      "type":"SEN",
      "descr":"T100"
   },
   "SENS02":{
      "type":"SEN",
      "descr":"T088",
      "uid":"X1A1AA",
      "check_on":"2014/06/29"
   },
   "SENS03":{
      "type":"SEN",
      "descr":"T000:",
      "uid":"X1A1AB",
      "check_on":"2014/06/29"
   },
   "LED1":{
      "type":"LED",
      "state":"0"
   }
}

答案 1 :(得分:0)

好的,所以我发现我的数据实际上是JS对象,如下面以平面格式表示,每个对象都用换行符分隔。

{"SENS01":{"type":"SEN","descr":"T100"}
{"element":"LED1","data":{"type":"LED","state":"0"}

使用linereader(来自npm)我能够通过执行来读取文件;

lineReader.eachLine('simple.txt', function(line) {

                var dump = JSON.parse(line);

                socket.emit('MAP.room1', dump);

                });

然后从Web套接字输出所需的数据。