2012-03-15 86 views
4

我想通過node.js中的TCP檢索一些字符串化的JSON,並且想要解析它。所以我的方法與此相似。我縮短並簡化它,所以你不必知道周圍的邏輯。node.js中的奇怪的JSON.parse()錯誤

socket.on("data", function(data) { 
    console.log(data.toString());    // Shows the original stringifyed version 
    console.log(JSON.parse(data.toString())); // Doesn't work 
}); 

完整的(美化)JSON是這樣的。正如你所看到的,沒有錯誤。

{ 
    "result": "success", 
    "source": "chat", 
    "success": { 
     "message": "test", 
     "time": 1331770513, 
     "player": "silvinci" 
    } 
} 

JSON.parse(data.toString())總是拋出我這個愚蠢的錯誤:

{"result":"success","source":"console","success":{"time":1331762264,"line":"20 
^ 
SyntaxError: Unexpected token { 
    at Object.parse (native) 
    at Socket.<anonymous> (/home/node/api.js:152:35) // irrelevant from here on 
    at Socket.emit (events.js:67:17) 
    at TCP.onread (net.js:347:14) 

所以我thougt:「怎麼可能是錯的JSON字符串讓我們試它一試不應該工作。」驚喜,驚喜!有效。爲什麼直接輸入字符串時會起作用?

+1

您是否真的運行了縮短和簡化的代碼? – 2012-03-15 01:40:02

+0

謝謝,我會深入研究這一點。 – buschtoens 2012-03-15 01:40:49

+1

也許這個流包含一些奇怪的控制字符...... data是一個字符串還是已經解析過的對象(或別的東西)? – 2012-03-15 01:40:56

回答

12

感謝@Felix Kling我發現了我的錯誤。過濾未轉義的字符非常重要,特別是在字符串化的JSON之外。我並沒有忽略串行化JSON之後的無形換行。

這是修復:

socket.on("data", function(data) { 
    console.log(data.toString());       // Shows the original stringified version 
    console.log(JSON.parse(data.toString().slice(0, -4))); // Trim the sequence "\r\n" off the end of the string 
}); 

請注意,這僅作品對我來說,因爲我有一個非常特殊的情況。服務器始終以JSON行響應,終止於\r\n - 不是空白字符,而是字面上反斜槓r和反斜槓n。
您的代碼可能(或可能)由於其他錯誤而失敗。但是當你解析錯誤時,檢查服務器的響應是一個很好的起點。

正如@Zack正確地指出,這是爲了去除意外的空白更一般的解決辦法:

JSON.parse(data.toString().trim()); 
+2

不知道上下文,無條件截斷字符串似乎有點危險。也許你應該在切片之前爲違規字符添加一個測試。 – MarkHu 2012-12-06 03:59:51

+0

在我的情況下,每個響應都以'\ r \ n'結束。但總的來說你是對的,所以我附加了一個通知。 – buschtoens 2012-12-08 18:09:09

+1

如果你看到這個問題,並希望更通用的解決方案使用類似於: 'JSON.parse(data.toString()。trim());' String.prototype.trim將刪除前導和尾隨空白。 – Zack 2016-03-24 16:18:07

2

我有一個類似的問題。對於更一般的解決方案,這也可以工作。它會在字符串前後刪除所有空白字符,因此您不必執行特定的子字符串長度。

JSON.parse(data.trim());