我使用JSON將數據發送到websocket。有時WebSocket的recive許多消息爲一體,event.data樣子:解析不正確的JSON
{"message1":"message1"}{"message2":"message2"}
,所以我不能用JSON.Parse解析它。如何處理這個問題?
我使用JSON將數據發送到websocket。有時WebSocket的recive許多消息爲一體,event.data樣子:解析不正確的JSON
{"message1":"message1"}{"message2":"message2"}
,所以我不能用JSON.Parse解析它。如何處理這個問題?
這裏是一個自動恢復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
之前的所有內容以及之後的內容。
謝謝,我工作得很好。 –
如果你不能修復它在發送端,它總是看起來是這樣,那麼你可能會嘗試修復它,用'}\n{'
取代'}{'
,各執換行,並有JSON字符串數組。
var array = input.replace('}{', '}\n{').split('\n');
請注意,如果你的輸入包含換行,那麼你必須使用另一個字符或字符串:
var array = input.replace('}{', '}==XXX=={').split('==XXX==');
而且它依賴於事實,你沒有'}{'
其他地方的字符串,其中可能並非如此。
一個比較正確的做法,但很難,會算{
和}
這不是字符串的內部,當你拿到相同數量的}
作爲{
數目,然後分割字符串那裏。
你需要做的是逐個字符地跟蹤你是否在報價單內,讓每個{
增加一個計數器,}
減少計數器並在你的計數器達到零時分割你的輸入。
另一個奇怪的方法是嘗試在每個可能的}
上拆分字符串,並嘗試將子字符串解析爲JSON,如果它是有效的,則使用它並從輸入中刪除。
問題是,在發送方它總是作爲1個對象發送,但不知何故在websocket上它可以被多次接收,我想如果它們在同一時間內重新接收。 –
如果你對API有任何控制,那麼我強烈建議你在那裏修復它。但是,如果你不這樣做,請繼續閱讀。
我認爲尋找「}」並不是一個真正的選擇,因爲你可能有嵌套的對象,並且}字符可能在一個字符串內,等等。
快速簡單的方法是嘗試解析以1個字符開頭的字符串並逐個添加字符,直到JSON解析器不失敗。那就是當你分析第一塊數據的時候。
將偏移量移至成功解析數據的末尾並重復。
可能不是一個優雅的解決方案或非常有效的解決方案,但你又有一個非標準的數據格式。
最好的解決辦法是修復發件人不要將郵件連接在一起。如果這不是一個選項,你有消息結構的任何保證(除了它們是有效的JSON)嗎? –
始終從源頭解決問題。當您的服務器代碼修改爲正確工作時,修復客戶端上的問題將會中斷。 –