2016-12-22 178 views
1

我使用JSON將數據發送到websocket。有時WebSocket的recive許多消息爲一體,event.data樣子:解析不正確的JSON

{"message1":"message1"}{"message2":"message2"} 

,所以我不能用JSON.Parse解析它。如何處理這個問題?

+7

最好的解決辦法是修復發件人不要將郵件連接在一起。如果這不是一個選項,你有消息結構的任何保證(除了它們是有效的JSON)嗎? –

+5

始終從源頭解決問題。當您的服務器代碼修改爲正確工作時,修復客戶端上的問題將會中斷。 –

回答

2

這裏是一個自動恢復JSON解析器,你可以用它來解析級聯jsons的例子:

function *multiJson(str) { 
 
    while (str) { 
 
     try { 
 
      yield JSON.parse(str); 
 
      str = ''; 
 
     } catch(e) { 
 
      var m = String(e).match(/position\s+(\d+)/); 
 
      yield JSON.parse(str.slice(0, m[1])); 
 
      str = str.slice(m[1]); 
 
     } 
 
    } 
 
} 
 

 
// 
 

 
let test = '{"message1":"message1"}{"message2":{"nested":"hi}{there"}}"third"[4,5,6]'; 
 

 
for (let x of multiJson(test)) 
 
    console.log(x)

基本上,如果有一個在n位置的語法錯誤,它會嘗試解析出n之前的所有內容以及之後的內容。

+0

謝謝,我工作得很好。 –

1

如果你不能修復它在發送端,它總是看起來是這樣,那麼你可能會嘗試修復它,用'}\n{'取代'}{',各執換行,並有JSON字符串數組。

var array = input.replace('}{', '}\n{').split('\n'); 

請注意,如果你的輸入包含換行,那麼你必須使用另一個字符或字符串:

var array = input.replace('}{', '}==XXX=={').split('==XXX=='); 

而且它依賴於事實,你沒有'}{'其他地方的字符串,其中可能並非如此。

一個比較正確的做法,但很難,會算{}這不是字符串的內部,當你拿到相同數量的}作爲{數目,然後分割字符串那裏。

你需要做的是逐個字符地跟蹤你是否在報價單內,讓每個{增加一個計數器,}減少計數器並在你的計數器達到零時分割你的輸入。

另一個奇怪的方法是嘗試在每個可能的}上拆分字符串,並嘗試將子字符串解析爲JSON,如果它是有效的,則使用它並從輸入中刪除。

+0

問題是,在發送方它總是作爲1個對象發送,但不知何故在websocket上它可以被多次接收,我想如果它們在同一時間內重新接收。 –

1

如果你對API有任何控制,那麼我強烈建議你在那裏修復它。但是,如果你不這樣做,請繼續閱讀。

我認爲尋找「}」並不是一個真正的選擇,因爲你可能有嵌套的對象,並且}字符可能在一個字符串內,等等。

快速簡單的方法是嘗試解析以1個字符開頭的字符串並逐個添加字符,直到JSON解析器不失敗。那就是當你分析第一塊數據的時候。

將偏移量移至成功解析數據的末尾並重復。

可能不是一個優雅的解決方案或非常有效的解決方案,但你又有一個非標準的數據格式。