2014-06-30 132 views
0

我很新的東西相關的很多代碼,但我是一個緩慢的,有時是痛苦的學習曲線。node.js中讀取文件中解析到JSON和輸出

我有一個包含一些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); 

    }); 
}); 

當我連接到插座被髮送(從服務器控制檯登錄)

調試以下 - WebSocket的寫作5 ::: {「名稱「:」MAP.room1「,」args「:[{」element「:」LED1「,」data「:{」type「:」LED「,」state「:」0「}}]}

我從來沒有得到任何其他的對象,只有這一個。我已經看了一遍關於如何遍歷對象的網絡,但它對我來說大體上毫無意義:(

我試圖實現的是當你從設備連接到web套接字的每個對象。 JSON文件是在同一時間推出1個對象,一旦這個工作我希望看到;

調試 - WebSocket的寫作5 ::: {「名」:「MAP.room1」,「ARGS」 :[{「element」:「LED1」,「data」:{「type」:「LED」,「state」:「0」}}]}

debug - websocket writing 5 ::: {「name 「:」 MAP.room1" , 「ARGS」:[{ 「元素」: 「SENS03」, 「數據」:{ 「類型」: 「SEN」, 「DESCR」: 「T000」, 「UID」:「X1A1AB 「,」check_on「:」2014/06/29「}}]} etc ...

如果我把console.log(data)行放在我的server.js中,那麼我會看到整個文件的預期結果。它只有一次被解析,我留下了1條。

誰能請解釋一下這是怎麼回事,我如何能夠最好地克服這一點。它需要以一種非常簡單的方式理想地使用我自己的代碼/數據集作爲示例,因此我可以理解「這對我意味着什麼」我閱讀的很多Web示例和內容傾向於使用不同的示例,這些示例只是讓我感到困惑。我知道聲明變量等的基礎知識,並且對Ruby有着非常有限的經驗,並且使用一個簡單的腳本來解析從API接收到的一些推送數據,但這只是關於它。

如果您需要任何更多的上下文等,那麼請讓我知道,否則任何幫助感激地接受。

+0

'元素'是唯一的,如果它有幫助,但在devices.json中的對象和嵌套是固定的 - 不幸的是,json是固定的,必須是這樣的,以便傳遞給d3來更新相當複雜的DOM。 d3的東西是由其他人提供的,我已經給出了關於我的web套接字如何輸出以更新正確的東西的規範。所以在不改變我的源代碼json(devises.json)的情況下是否有辦法解決這個問題? – user3788685

+0

想想我已經找到了一種方法來解決這個問題。一旦我確定它按預期工作,我會發佈一個答案。 – user3788685

回答

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

       }); 

然後從網絡套接字輸出所需的數據。

0

我覺得你的問題是,你使用你的JSON相同的密鑰。當解析器讀入JSON時,它會不斷覆蓋以前的值elementdata,並且由於這些是唯一的唯一鍵名稱,所以這些是您看到的唯一兩個值。

如果您修改了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" 
    } 
} 
+0

好吧 - 我現在明白你的意思了,用我的輸入解析了http://json.parser.online.fr/中的json,輸出結果正是我所得到的(所以現在我明白了你所做的論點devices.json的設置方式)可悲的是,我現在無法真正改變這種情況,所以我仍然在尋找某種解決方法。或者因爲我的devices.json是一個有效的json文件,我無法以某種方式使用沒有'JSON.parse'的?我之前嘗試過一些東西,但是我的web套接字輸出中充滿了/ r/n和其他轉義字符,所以如果有更好的方法來達到相同的最終目標,我會感興趣。 – user3788685

+0

我用你的json運行了一個測試,而'JSON.parse'返回所有的數據,我仍然需要一種方法來在每個對象發送到web套接字之前拆分每個對象。目前,我需要使用已格式化的json,並且找到一種解析方法,並將它一次發送到web套接字一個對象。 (例如,SENS01,然後是SENS02,然後是SENS03等,一直到devices.json文件。 – user3788685

+0

如果你不控制數據,那麼你將不得不找到第三方JSON解析器(有幾個npm),它允許reviver/callback,並且可以傳遞重複key =>值對。 – mscdex