JSON dizisi nasıl ayrıştırılır Javascript


93

Sunucudan JSON mesajı almak için Sencha Touch (ExtJS) kullanıyorum. Aldığım mesaj şudur:

{
"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"
    }

    ]
}

Benim sorunum, bu JSON nesnesini ayrıştıramıyorum, böylece sayaç nesnelerinin her birini kullanabilirim.

Bunu şöyle bir başarmaya çalışıyorum:

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

Neyi yanlış yapıyorum ? Teşekkür ederim!


Yanıtlar:


142

Javascript, dizeler için yerleşik bir JSON ayrıştırmasına sahiptir ve bence sahip olduğunuz şey budur:

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

bunu örneğinizle kullanmak şöyle olacaktır:

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

İşte çalışan bir örnek

DÜZENLEME : For döngüsünü kullanımınızda bir hata var (bunu ilk okumamda kaçırdım, spot için @Evert'e kredi verin). bir for-in döngüsü kullanmak, var'ı gerçek veri değil, geçerli döngünün özellik adı olacak şekilde ayarlar. Doğru kullanım için yukarıdaki güncellenmiş döngüme bakın

ÖNEMLİ : JSON.parseyöntem eski tarayıcılarda işe yaramayacaktır - bu nedenle, web sitenizi bir tür internet bağlantısının zamanını değiştirerek kullanılabilir hale getirmeyi planlıyorsanız, bu bir sorun olabilir! Yine de gerçekten ilgileniyorsanız, işte bir destek çizelgesi (tüm kutularımı işaretleyen).


1
Tarayıcılar arası parseJSON işlevini destekleyen bir kitaplık kullanıyorsa, bunu kullanmalıdır. Ayrıca döngü hatasını tekrarlıyorsunuz.
Bergi

Bunu çalıştırdığımda ilk satırda bir hata alıyorum: Yakalanmamış Sözdizimi Hatası: Beklenmeyen simge o
geceler

@nights: Bu da büyük olasılıkla daha sonra geçersiz JSON dizesi olması, çevrimiçi bir JSON doğrulama aracı denemek bunun gibi
musefan

8

Bu benim cevabım

<!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

Döngüde çalışan değişken, özellik değerini değil, özellik adını tutar.

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

Ancak sayaçlar bir Dizi olduğu için normal bir for-döngüsü kullanmanız gerekir:

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

1

Sunucu verileriyle etkileşim için "Sencha yolu", Ext.data.Storebir Ext.data.proxy.Proxy(bu durumda Ext.data.proxy.Ajax) ile donatılmış bir vekil sunucu kurmaktır Ext.data.reader.Json(JSON kodlu veriler için, başka okuyucular da mevcuttur). Verileri sunucuya geri yazmak için Ext.data.writer.Writerçeşitli türlerde e-postalar vardır.

İşte bunun gibi bir kurulum örneği:

    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.jsonbu örnekte ( bu keman da mevcuttur ), verilerinizi kelimesi kelimesine içerir. idProperty: 'counter_name'bu durumda muhtemelen isteğe bağlıdır, ancak genellikle birincil anahtar özelliğini işaret eder. rootProperty: 'counters'hangi özelliğin veri öğeleri dizisini içerdiğini belirtir.

Bu şekilde bir mağaza kurulumuyla, arayarak sunucudaki verileri yeniden okuyabilirsiniz store.load(). Mağazayı ızgaralar, listeler veya formlar gibi herhangi bir Sencha Touch'a uygun UI bileşenine de bağlayabilirsiniz.



0

Bu cazibe gibi çalışıyor!

Bu yüzden kodu ihtiyacıma göre düzenledim. Ve işte değişiklikler: ID numarasını yanıttan ortam değişkenine kaydedecektir.

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

Daha yüksek oyla cevapta bir hata var. onu kullandığımda 3. satırda buldum:

var counter = jsonData.counters[i];

Bunu şu şekilde değiştirdim:

var counter = jsonData[i].counters;

ve benim için çalıştı. 3. satırdaki diğer cevaplardan bir fark var:

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
Belki demek teneke dediğin yerde gerektiği . Bununla birlikte, kodunuza daha fazla ayrıntı / açıklama eklemeniz daha iyidir, bu OP'ye ve aynı soruyu soran diğer kişilere daha iyi yardımcı olacaktır.
Tiw

Ayrıca, kullanıcının biraz daha fazla öğrenmesi için bu yöntemi neden seçtiğinizi de biraz açıklayabilirsiniz. Bu, bu cevabı geliştirmeye yardımcı olur.
TsTeaTime

en çok oy alan cevap bu soruyu cevapladı, ancak kullandığımda 4. satırda yanlış olduğunu anladı: var counter = jsonData.counters [i]; Ama bunu şu şekilde değiştiriyorum: var counter = jsonData [i] .counters; ve işe yaradı. bu yüzden yapmalıyım yerine can dedim.
Mehdi Celali


-1

ExtJ'lerde bir veri deposu ve proxy kullanmalısınız. Çok sayıda örnek var ve JSON okuyucusu JSON mesajını belirttiğiniz modele otomatik olarak ayrıştırır.

ExtJ'leri kullanırken temel Javascript kullanmaya gerek yoktur, her şey farklıdır, her şeyi doğru yapmak için ExtJ'lerin yollarını kullanmalısınız. Orada belgeleri dikkatlice okuyun, iyidir.

Bu arada, bu örnekler ExtJ'lerle aynı temel işlevlere dayanan Sencha Touch (özellikle v2) için de geçerlidir.


-1

Verilerimin tam olarak eşleşip eşleşmediğinden emin değilim, ancak sayfaları kullanırken jQuery FormBuilder'dan dışa aktarılan bir dizi JSON nesnesi vardı.

Umarım cevabım, sahip olduğuma benzer bir soruna cevap arayan bu soruya rastlayan herkese yardımcı olabilir.

Veriler biraz şuna benziyordu:

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

Bunu ayrıştırmak için yaptığım şey basitçe aşağıdakileri yapmaktı:

JSON.parse("["+allData.toString()+"]")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.