如何通过使用node.js从实时json数据中提取特定字段来创建新的单个json对象

时间:2014-07-23 05:49:34

标签: json node.js http mqtt real-time-data

我有以下代码,它使用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数据。

1 个答案:

答案 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);