3

我有以下代码,它使用 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'中获取指定url中的所有json数据。我需要从接收到的数据中提取'id'和'value'并将其作为单个JSON对象并需要将其发布到mqtt,这样另一个客户端只能将“id”和“value”订阅为 json 数据。

4

1 回答 1

1

要将 JSON 文本转换为对象,可以使用 eval() 函数。eval() 调用 JavaScript 编译器。由于 JSON 是 JavaScript 的真子集,因此编译器将正确解析文本并生成对象结构。文本必须用括号括起来,以避免在 JavaScript 语法中出现歧义。

var myObject = eval(message);

eval 函数非常快。但是,它可以编译和执行任何 JavaScript 程序,因此可能存在安全问题。当来源受信任且有能力时,指示使用 eval 。使用 JSON 解析器要安全得多。在通过 XMLHttpRequest 的 Web 应用程序中,只允许与提供该页面的同一源进行通信,因此它是受信任的。但它可能没有能力。如果服务器的 JSON 编码不严格,或者它没有严格验证其所有输入,那么它可能会传递可能携带危险脚本的无效 JSON 文本。eval 函数将执行脚本,释放其恶意。

为了防止这种情况,应该使用JSON 解析器。JSON 解析器将仅识别 JSON 文本,拒绝所有脚本。在提供原生 JSON 支持的浏览器中,JSON 解析器也比 eval 快得多。

var myObject = JSON.parse(message);

并将其用作对象:

myObject.id;
myObject.value;

创建一个只有 id 和 value 的对象:

var idAndValueObj = {};
idAndValueObj.id = myObject.id;
idAndValueObj.value = myObject.value;

转换为 JSON 字符串:

var jsonStr = JSON.stringify(idAndValueObj);
于 2014-07-23T07:39:22.907 回答