2014-07-23 3 views
3

다음 코드는 mqtt를 사용하여 지정된 URL에 json 데이터를 게시하는 코드입니다. http에서 초기 데이터를 검색합니다. 다음node.js를 사용하여 실시간 json 데이터에서 특정 필드를 추출하여 새 단일 json 객체를 만들 수 있습니까?

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; 
})) 

내가 지정한 URL에있는 모든 JSON 데이터를 얻을, 위의 코드에서 MQTT

var mqtt = require('mqtt'); 
var client = mqtt.createClient(); 
client.subscribe('NewTopic'); 
client.on('message', function(topic, message) { 
    console.info(message); 
}); 

를 통해 (위의 코드에서) 게시 된 데이터를 구독 가입자 코드 수신 된 데이터에서 'id'와 'value'를 추출하여 단일 JSON 객체로 만들고이를 mqtt에 게시하여 다른 클라이언트가 'id'와 'value'만 구독 할 수 있도록해야합니다. '을 json 데이터로 사용합니다.

답변

1

JSON 텍스트를 개체로 변환하려면 eval() 함수를 사용할 수 있습니다. eval()은 JavaScript 컴파일러를 호출합니다. JSON은 JavaScript의 적절한 하위 세트이므로 컴파일러는 텍스트를 올바르게 구문 분석하고 객체 구조를 생성합니다. JavaScript 구문에서 모호성을 피하기 위해 텍스트를 괄호로 묶어야합니다.

var myObject = eval(message); 

평가 기능이 매우 빠릅니다. 그러나 모든 JavaScript 프로그램을 컴파일하고 실행할 수 있으므로 보안 문제가 발생할 수 있습니다. 소스가 신뢰할 수 있고 유능한 경우 eval을 사용합니다. JSON 구문 분석기를 사용하는 것이 훨씬 안전합니다. XMLHttpRequest를 통한 웹 응용 프로그램에서는 해당 페이지를 제공하는 동일한 출처에서만 통신이 허용되므로 신뢰할 수 있습니다. 그러나 유능하지 않을 수도 있습니다. 서버가 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); 
+0

을 내가 할 수있는 방법 새로운 단일 json 객체로서의이 id와 value? – user3599