我有以下代码,它使用mqtt在指定的url中发布json数据。从http中检索初始数据。
var request = require('request');
var JSONStream = require('JSONStream');
var es = require('event-stream');
var mqtt = require('mqtt');
request({url: 'http://isaacs.couchone.com/registry/_all_docs'})
.pipe(JSONStream.parse('rows.*'))
.pipe(es.mapSync(function (data) {
console.info(data);
var client = mqtt.createClient(1883, 'localhost');
client.publish('NewTopic', JSON.stringify(data));
client.end();
return data;
}))
以下是订阅者代码,订阅通过mqtt发布的数据(在上面的代码中)
var mqtt = require('mqtt');
var client = mqtt.createClient();
client.subscribe('NewTopic');
client.on('message', function(topic, message) {
console.info(message);
});
在上面的代码中,我在' message'中获取指定网址中的所有json数据。我需要提取' id'和'价值'从收到的数据中将其作为单个JSON对象并将其发布到mqtt,以便另一个客户端只能订阅' id'和'价值'作为json数据。
答案 0 :(得分:1)
要将JSON文本转换为对象,可以使用eval()函数。 eval()调用JavaScript编译器。由于JSON是JavaScript的适当子集,因此编译器将正确解析文本并生成对象结构。文本必须包含在parens中,以避免绊倒JavaScript语法中的歧义。
var myObject = eval(message);
eval功能非常快。但是,它可以编译和执行任何JavaScript程序,因此可能存在安全问题。当源是可信的并且胜任时,指示使用eval。使用JSON解析器更安全。在基于XMLHttpRequest的Web应用程序中,只允许与提供该页面的同一源进行通信,因此它是可信的。但它可能没有能力。如果服务器的JSON编码不严格,或者它没有严格验证其所有输入,那么它可能会传送可能带有危险脚本的无效JSON文本。 eval函数将执行脚本,释放它的恶意。
为防止这种情况,应使用JSON parser。 JSON解析器将仅识别JSON文本,拒绝所有脚本。在提供本机JSON支持的浏览器中,JSON解析器也比eval快得多。
var myObject = JSON.parse(message);
并将其用作对象:
myObject.id;
myObject.value;
Create a object只有id和值:
var idAndValueObj = {};
idAndValueObj.id = myObject.id;
idAndValueObj.value = myObject.value;
转换为JSON字符串:
var jsonStr = JSON.stringify(idAndValueObj);