2015-12-12 2 views
1

На переднем конце я получаю «фрагментированные» данные (JSON массивы) с использованием «XHR» (OnProgress)Разбор потоков JSon массивов

Когда куски прибывают с задержкой между ними - все нормально, этим случаем прост в обращении - я просто помню длину ответа и смещение на эту сумму.

Проблема возникает, когда более 1 «чанкированного» ответа поступает одновременно, что делает окончательный ответ неповторимым, так как он неправильный json.

Состав:

[array 1][array 2] ... [array N] 

Пример: [{"response": [{"itemId": 1}]}][{"response": [{"itemId": 2}]}]

Вопрос: есть ли способ, чтобы разобрать его? Я пытался использовать регулярные выражения - он работал нормально до тех пор, пока у вас есть субмассивы внутри тел ответа. Другими словами - это не удастся для вышеупомянутого примера.

Это будет соответствовать этому:

1) {"response": [{"itemId": 1} 
2) {"response": [{"itemId": 2} 

Выходные (матчи) Я ищу:

1) {"response": [{"itemId": 1}]} 
2) {"response": [{"itemId": 2}]} 

Это регулярное выражение, я использую прямо сейчас.

\[(.*?)\]/gi 

Любые способы сделать это с использованием регулярных выражений или мне нужны разные подходы для этого? Спасибо заранее!

ответ

2

Предполагая, что «источник», где ломти получить в наличии, вы можете:

var source = '[{"response": [{"itemId": 1}]}][{"response": [{"itemId": 2}]}]'; 
var chunks = JSON.parse('[' + source.replace(/\]\[/g, '\],\[') + ']'); 
for (var i in chunks) { 
    // then work with chunks[i]... 
} 
+0

Это решение работает очень хорошо! Простой и эффективный. Большое спасибо! – Dmitri

+0

Рад помочь :) – cFreed