2016-04-13 43 views
1

我使用Socket.IO將數據移動到瀏覽器。發送的數據是一串JSON對象,當它到達瀏覽器時,它將成爲一個大的JSON字符串。問題是,這個JSON不能被JSON.parse()分析,因爲它不是「真正的」JSON。如何在瀏覽器中解析串聯的JSON字符串?

數據結構可以是任意的,因此RegEx可能無法做到這一點。而這個當前的設置只是暫時的。最終,這個JSON流將在服務器端進行預處理,因此不需要將流發送到瀏覽器,所以我想保留現在的AJAX/Socket.IO設置,而不是切換到JSON流解析器,如OboeJS

我能做些什麼來解析這串串聯的JSON?

爲了清楚起見,將JSON是這樣的:

{"a":"A"}{"b":"B"}{"c":"C"} 

而且我試圖解析它,這樣我可以訪問他們喜歡的方式:

console.log(Object.a) //A 
console.log(Object.b) //B 
console.log(Object.c) //C 
+0

你想用數據的工作,如果你收到JSON?您確定數據總是採用格式「{} {} {} {}」嗎? – Dropout

+0

@Dropout是的,我喜歡。並且它將始終採用格式「{} {} {} {}」,因爲它將被連接成JSON,但這簡化了它。每個JSON可能都有嵌套的數據,例如'{{} {}} {} {} {}';或者可能有類似'{「a」:「這是有效的JSON}」}' – markovchain

+0

那不是JSON。如果您剛剛連接了幾個JSON,則可以拆分它們並在該數組上調用JSON.parse,但是如果您有類似於{{}} {} {{}} {} {}}你真的不能期望它被任何真正的事情解析,因爲很難將規則應用於這樣的事情。那只是垃圾輸入數據。看起來像你將不得不實施*翻譯*的東西.. – Dropout

回答

-1

斯普利特大字符串{a:'A'}{b:'B'}{c:'C'}並分別解析它們

2

在您的具體情況下,您可以使用Array.prototype.reduce將所有JSON對象合併爲一個:

var unstructuredJson = '{"a":"A"}{"b":"B"}{"c":"C"}'; 
 
var jsonArray = "[" + unstructuredJson.split("}{").join("},{") + "]"; 
 
var objectArray = JSON.parse(jsonArray); 
 

 
var result = objectArray.reduce(function(result, item) { 
 
    Object.keys(item).forEach(function(propertyName) { 
 
    result[propertyName] = item[propertyName]; 
 
    }); 
 

 
    return result; 
 
}, {}); 
 

 

 
document.body.textContent = JSON.stringify(result);

OP在一些評論說:

[...]每個JSON可能嵌套像{{} {}} {} {} {}

數據

然後,在這種情況下,上述方法被打破。

我的兩分錢是你應該在流這些JSON對象時放一些分隔符,並且生活會更容易:你可以很容易地分離父對象,你只需要用整個分隔符來改變split("}{")

我建議你使用一些永遠不會發生的角色作爲任何屬性值的一部分。你可以找到這個維基百科的文章上控制字符:Control character

+0

@RobG你的意思是無效的JSON? –

+0

確切地說..也許類似於'JSON.parse(data.split(「} {」)。join(「},{」))',但是內部對象需要像你提到的那樣是有效的JSONs .. – Dropout

+0

@Dropout可能OP已經把一些樣本JSON手工完成了,而實際的JSON是有效的......順便說一下,如果OP沒有發送有效的JSON,他/她應該開始修復這個問題,否則OP將需要創建一個新的non- JSON解析器... –

0

如果每個子是有效的JSON,但串接部分是不是,你可以把串入一個有效的數組文本並使用JSON.parse,那麼你可以使用Array方法處理每個對象,例如的forEach

var s = '{"a":"A"}{"b":"B"}{"c":"C"}'; 
 
var obj = JSON.parse('[' + s.replace(/}{/g,'},{') + ']').forEach(function (obj) { 
 
    document.write(JSON.stringify(obj) + '<br>'); 
 
});

或者,如果你想讓它作爲一個對象:

var s = '{"a":"A"}{"b":"B"}{"c":"C"}'; 
 
var obj = JSON.parse(s.replace(/}{/g,',')); 
 

 
document.write(JSON.stringify(obj));

+0

對不起,我更新了示例以使其成爲有效的JSON – markovchain