2012-07-10 50 views
3

我在看一個JSON看起來像這樣解析粘在一起的JSON在JavaScript

{ 
    "key": "cow", 
    "value": "woof" 
} 
{ 
    "key": "dog", 
    "value": "moo" 
} 

而且我婉解析它,但JSON.parse不起作用,因爲事情作爲一個整體ISN 't 真的 json。其實沒有任何新行要麼,所以它看起來像

{"key": "cow","value": "woof"}{"key": "dog","value": "moo"} 

至於爲什麼,這是從彗星端點來的數據流。理想情況下,它應該一個接一個,但有時候會有一箇中斷,在它回來後,我會收到自中斷髮生以來發生的所有更改列表,並將它們串聯在一起。所以,如果三個類型的字典進行了指有所回落,而連接已斷開,我會在最後得到一次全部:

{"key": "cow","value": "woof"}{"key": "dog","value": "moo"}{"key":"cat","value":"baaa"} 

是否有瀏覽器解析這種JSON的任何方便的方式?

編輯:對不起,我沒有提到對象可以任意嵌套,可以包含各種各樣的東西,Unicode字符,數組,對象,對象數組,對象,各種形狀和大小的括號等。 。所以在這些情況下,大多數hacky的字符串拆分或正則表達式解決方案都會失敗。我沒有把任何這些例子,因爲我是懶惰,而是一種比較有代表性的例子可能是

{ 
    "key": "cow", 
    "value": { 
     "body": "big", 
     "name": "sally", 
     "children": [ 
      "bob", 
      "daisy" 
     ] 
    }, 
    "alt-key": "牛" 
} 
{ 
    "key": "dog", 
    "value": "moo{}{}{}}}} i love brackets[[[]] ]]]]  }{}", 
    "array": [ 
     "豆沙包", 
     "叉燒包" 
    ] 
} 

雖然正則表達式/ stringsplit事會工作的95%的時間,我在尋找嚴格正確的解決方案,永遠喂正確的json

+0

的可能重複的[如何可以解析在JS一個流的第一對象的JSON(http://stackoverflow.com/questions/9829811/how-can-i-parse-the-first-json-object-上一個流式-JS)或[解析實時流的HTTP區塊與jQuery傳遞JSON?](http://stackoverflow.com/q/5927932/1048572) – Bergi 2012-07-10 17:11:17

回答

0

如果是我的話,我只寫一個JSON解析器能夠理解JSON表達式的流。 JSON是關於一樣簡單的語法去分析,並作出分析器這是能夠爲新的一句話,「復位」本身是一個簡單的(一旦解析器存在)。

哎呀,你可以從json.org解析器本身開始。

爲了可靠地「修理」你當前的數據是來自真正貼近反正寫一個解析器的項目。

4

時,如果值和鍵不會包含}{工作,你可以簡單地添加逗號,使其有效的JSON(並添加方括號,使其成爲一個數組):

var json = '[' + json.replace(/}{/g, '},{') + ']'; 

這甚至會工作如果你只有一個對象作爲響應。

+0

+1毆打我相同的答案。 – 2012-07-10 16:38:26

2

嘗試這樣的:

var arrayOfObjects = flowstring.match(/{.*?}/g).map(function(value){ 
    return JSON.parse(value); 
}); 

,你將有數組對象:

[{"key": "cow","value": "woof"},{"key": "dog","value": "moo"}.......] 
+1

哇,這很聰明:-) – 2012-07-10 16:39:13

+2

請注意,這隻適用於對象不嵌套和字符串不能包含'}'。 – 2012-07-10 16:39:37

+0

@Charmander問題很明顯,對象不能嵌套。 – Engineer 2012-07-10 16:40:56

0

嘗試轉換,爲一個數組,然後解析。事情是這樣的:

var json = '{"key": "cow","value": "woof"}{"key": "dog","value": "moo"}'; 
var newjson = '[' + json.replace(/\}\{/g, '},{') + ']'; 
var obj = JSON.parse(newjson);