2016-04-13 8 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オブジェクトを1つにまとめることができます。

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("}{")を変更するだけです。

プロパティ値の一部として使用されない文字を使用することをお勧めします。各部分が有効なJSONですが、連結部分がない場合に、その後、あなたは文字通りの有効な配列に文字列を回し、JSON.parseを使用することができ、Control character

+0

@RobG無効なJSONを意味しますか? –

+0

まさに 'JSON.parse(data.split("} {")。join("}、{"))'のようなものかもしれませんが、内側のオブジェクトは前述したように有効なJSONでなければなりません。 – Dropout

+0

@Dropout OPが有効なJSONを送信していない場合は、この問題の修正を開始する必要があります。そうでない場合は、OPは新しい非JSONを作成する必要があります。 JSONパーサー... –

0

:あなたはこのWikipediaの記事の制御文字を見つけることができます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

関連する問題