3

私はこのようなjsonを見ています

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

そして、私はそれを解析したいのですが、JSON.parse は機能しません。全体としては本当にjson ではないからです。実際には改行もありませんので、次のようになります

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

理由については、これは Comet エンドポイントからのストリームです。理想的には、それは 1 つずつ来るはずですが、時々中断があり、それが戻ってきた後、中断が起こってから起こったすべての変更のリストをつなぎ合わせて受け取ります。したがって、接続が切断されている間に 3 つの dict がダウンすることを意図していた場合、最後にそれらすべてを一度に取得します。

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

この種の json をブラウザで解析する便利な方法はありますか?

編集:申し訳ありませんが、オブジェクトを任意にネストでき、あらゆる種類のもの、Unicode文字、配列、オブジェクト、オブジェクトを含む配列、すべての形状とサイズのブレースなどを含めることができるとは言いませんでした。これらの場合、文字列分割または正規表現ソリューションは失敗します。私は怠け者だったので、これらの例には何も入れませんでしたが、より代表的な例は次のとおりです。

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

regex/stringsplit は 95% の確率で機能しますが、正しい json が供給されたときに常に機能する厳密に正しいソリューションを探しています

4

4 に答える 4

4

値とキーに が含まれていない場合は}{、コンマを追加して有効な JSON にすることができます (また、角かっこを追加して配列にします)。

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

これは、応答として単一のオブジェクトのみを取得する場合でも機能します。

于 2012-07-10T16:36:28.187 に答える
2

このようにしてみてください:

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

そして、このオブジェクトの配列があります:

[{"key": "cow","value": "woof"},{"key": "dog","value": "moo"}.......]
于 2012-07-10T16:37:09.253 に答える
0

私だったら、JSON 式のストリームを理解する JSON パーサーを書きます。JSON は、文法と同じくらい簡単に解析できます。また、新しい文に対して自分自身を「リセット」できるパーサーを作成するのは簡単です (パーサーが存在すれば)。

json.org パーサー自体から始めることもできます。

とにかく、現在のデータを確実に「修正」することは、パーサーの作成に非常に近いプロジェクトです。

于 2012-07-10T18:09:26.240 に答える
0

それを配列に変換してから、それを解析してみてください。このようなもの:

var json = '{"key": "cow","value": "woof"}{"key": "dog","value": "moo"}';
var newjson = '[' + json.replace(/\}\{/g, '},{') + ']';
var obj = JSON.parse(newjson);
于 2012-07-10T16:37:38.580 に答える