JavaScriptでJSON配列を解析する方法


92

Sencha Touch(ExtJS)を使用してサーバーからJSONメッセージを取得しています。私が受け取るメッセージはこれです:

{
"success": true,
"counters": [
    {
        "counter_name": "dsd",
        "counter_type": "sds",
        "counter_unit": "sds"
    },
    {
        "counter_name": "gdg",
        "counter_type": "dfd",
        "counter_unit": "ds"
    },
    {
        "counter_name": "sdsData",
        "counter_type": "sds",
        "counter_unit": "   dd       "
    },
    {
        "counter_name": "Stoc final",
        "counter_type": "number    ",
        "counter_unit": "litri     "
    },
    {
        "counter_name": "Consum GPL",
        "counter_type": "number    ",
        "counter_unit": "litri     "
    },
    {
        "counter_name": "sdg",
        "counter_type": "dfg",
        "counter_unit": "gfgd"
    },
    {
        "counter_name": "dfgd",
        "counter_type": "fgf",
        "counter_unit": "liggtggggri     "
    },
    {
        "counter_name": "fgd",
        "counter_type": "dfg",
        "counter_unit": "kwfgf       "
    },
    {
        "counter_name": "dfg",
        "counter_type": "dfg",
        "counter_unit": "dg"
    },
    {
        "counter_name": "gd",
        "counter_type": "dfg",
        "counter_unit": "dfg"
    }

    ]
}

私の問題は、このJSONオブジェクトを解析できないため、各カウンターオブジェクトを使用できないことです。

私はそれをこのように達成しようとしています:

var jsonData = Ext.util.JSON.decode(myMessage);
for (var counter in jsonData.counters) {
     console.log(counter.counter_name);
 }

何が悪いのですか?ありがとうございました!


回答:


140

JavaScriptには、文字列用の組み込みのJSON解析があります。

var myObject = JSON.parse("my json string");

これをあなたの例で使うには:

var jsonData = JSON.parse(myMessage);
for (var i = 0; i < jsonData.counters.length; i++) {
    var counter = jsonData.counters[i];
    console.log(counter.counter_name);
}

これが実際の例です

編集:forループの使用に誤りがあります(私は最初の読み取りでこれを見逃しました、@ Evertにスポットを当ててください)。for-inループを使用すると、varが実際のデータではなく、現在のループのプロパティ名に設定されます。正しい使い方については、上記の更新されたループを参照してください

重要:このJSON.parse方法は古い古いブラウザでは機能しません。そのため、時間を曲げるようなインターネット接続を介してWebサイトを利用できるようにする場合は、これが問題になる可能性があります。あなたが本当に興味があるなら、ここにサポートチャートがあります(これは私のすべてのボックスをチェックしています)。


1
クロスブラウザーのparseJSON関数をサポートするライブラリーを使用する場合は、それを使用する必要があります。また、ループミスを繰り返します。
Bergi

これを実行すると、最初の行でエラーが発生します。UncaughtSyntaxError:Unexpected token o
nights

@nights:無効なJSON文字列がある可能性が高いため、次のような
musefan

8

これが私の答えです

<!DOCTYPE html>
<html>
<body>
<h2>Create Object from JSON String</h2>
<p>
First Name: <span id="fname"></span><br> 
Last Name: <span id="lname"></span><br> 
</p> 
<script>
var txt = '{"employees":[' +
'{"firstName":"John","lastName":"Doe" },' +
'{"firstName":"Anna","lastName":"Smith" },' +
'{"firstName":"Peter","lastName":"Jones" }]}';

//var jsonData = eval ("(" + txt + ")");
var jsonData = JSON.parse(txt);
for (var i = 0; i < jsonData.employees.length; i++) {
    var counter = jsonData.employees[i];
    //console.log(counter.counter_name);
    alert(counter.firstName);
}

</script>
</body>
</html>

6

for-in-loopでは、実行中の変数はプロパティ値ではなくプロパティ名を保持します。

for (var counter in jsonData.counters) {
    console.log(jsonData.counters[counter].counter_name);
}

ただし、countersは配列であるため、通常のforループを使用する必要があります。

for (var i=0; i<jsonData.counters.length; i++) {
    var counter = jsonData.counters[i];
    console.log(counter.counter_name);
}

1

サーバーデータとやり取りするための "Sencha方法"はExt.data.StoreExt.data.proxy.Proxy(この場合はExt.data.proxy.Ajax)を備えたプロキシをセットアップしますExt.data.reader.Json(JSONでエンコードされたデータの場合、他のリーダーも利用できます)。サーバーにデータを書き戻すにはExt.data.writer.Writer、いくつかの種類があります。

そのような設定の例を次に示します。

    var store = Ext.create('Ext.data.Store', {
        fields: [
            'counter_name',
            'counter_type',
            'counter_unit'
        ],

        proxy: {
            type: 'ajax',
            url: 'data1.json',

            reader: {
                type: 'json',
                idProperty: 'counter_name',
                rootProperty: 'counters'
            }
        }
    });

data1.jsonこの例では(このフィドルでも使用可能)、データが逐語的に含まれています。idProperty: 'counter_name'この場合、おそらくオプションですが、通常は主キー属性を指します。rootProperty: 'counters'データ項目の配列を含むプロパティを指定します。

この方法でストアをセットアップすると、を呼び出してサーバーからデータを再度読み取ることができますstore.load()。ストアをグリッド、リスト、フォームなどのSencha Touchの適切なUIコンポーネントにワイヤリングすることもできます。



0

これは魅力のように機能します!

だから私は私の要件に従ってコードを編集しました。そしてここに変更があります:応答からのID番号を環境変数に保存します。

var jsonData = JSON.parse(responseBody);
for (var i = 0; i < jsonData.data.length; i++)
{
    var counter = jsonData.data[i];
    postman.setEnvironmentVariable("schID", counter.id);
}

0

投票数が多い方の回答に誤りがあります。私がそれを使用したとき、私は3行目でそれを見つけます:

var counter = jsonData.counters[i];

私はそれを次のように変更しました:

var counter = jsonData[i].counters;

そしてそれは私のために働いた。3行目の他の回答との違いがあります。

var jsonData = JSON.parse(myMessage);
for (var i = 0; i < jsonData.counters.length; i++) {
    var counter = jsonData[i].counters;
    console.log(counter.counter_name);
}

1
多分あなたはあなたが言うべき場所でを意味するかもしれません。ただし、コードに詳細/説明を追加すると、OPや同じ質問を持つ他の人々の助けになります。
Tiw、

また、この方法を選択した理由について少し説明して、ユーザーがさらに学習できるようにすることもできます。それはこの答えを改善するのに役立ちます。
TsTeaTime

最も投票数の多い回答でこの質問に回答しましたが、使用すると4行目で間違っていることがわかりました。var counter = jsonData.counters [i]; しかし、次のように変更します。var counter = jsonData [i] .counters; そしてそれは働いた。だから私はすべきではなくできると言いました
Mahdi Jalali、

0

ヘッズアップのように...

var data = JSON.parse(responseBody);

廃止れました

郵便配達員ラーニングセンターは提案します

var jsonData = pm.response.json();

-1

ExtJsではデータストアとプロキシを使用する必要があります。これには多くのがあり、JSONリーダーはJSONメッセージを自動的に解析して、指定したモデルに変換します。

ExtJを使用する場合、基本的なJavascriptを使用する必要はありません。すべてが異なります。ExtJの方法を使用してすべてを正しく行う必要があります。ドキュメンテーションを注意深く読んでください、それは良いことです。

ちなみに、これらの例は、ExtJと同じコア機能に基づくSencha Touch(特にv2)にも当てはまります。


-1

データが正確に一致するかどうかはわかりませんが、ページを使用するときにjQuery FormBuilderからエクスポートされたJSONオブジェクトの配列の配列がありました。

うまくいけば、私の答えは、私が持っていたものと同様の問題への答えを探しているこの質問に出くわした人を助けることができます。

データは次のようになります。

var allData = 
[
    [
        {
            "type":"text",
            "label":"Text Field"
        }, 
        {
            "type":"text",
            "label":"Text Field"
        }
    ],
    [
        {
            "type":"text",
            "label":"Text Field"
        }, 
        {
            "type":"text",
            "label":"Text Field"
        }
    ]
]

これを解析するために私がしたことは、単に次のことをすることでした:

JSON.parse("["+allData.toString()+"]")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.