我对任何与代码相关的东西都很陌生,但我的学习曲线缓慢而且有时很痛苦。
我有一个包含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的使用非常有限。
如果您需要更多上下文等,请告诉我,否则感谢任何帮助。
答案 0 :(得分:0)
我认为您的问题是您在JSON中使用相同的密钥。当解析器读入该JSON时,它会不断覆盖element
和data
的先前值,因为这些是唯一的唯一键名,这些是您看到的唯一两个值。
如果您修改了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套接字输出所需的数据。