जावास्क्रिप्ट कैसे JSON सरणी पार्स करने के लिए


93

सर्वर से JSON संदेश प्राप्त करने के लिए मैं Sencha Touch (ExtJS) का उपयोग कर रहा हूं। मुझे जो संदेश मिलता है वह यह है:

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

मैं क्या गलत कर रहा हूं ? धन्यवाद!


जवाबों:


142

जावास्क्रिप्ट में स्ट्रिंग के लिए 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);
}

यहाँ एक कार्यशील उदाहरण है

संपादित करें : लूप के लिए आपके उपयोग में एक गलती है (मैं अपने पहले पढ़ने पर चूक गया, मौके के लिए @ एवर्ट को श्रेय)। फ़ॉर-इन लूप का उपयोग करने से var को वर्तमान लूप की संपत्ति के नाम के रूप में सेट किया जाएगा, वास्तविक डेटा नहीं। सही उपयोग के लिए ऊपर मेरा अद्यतन लूप देखें

महत्वपूर्ण : यह JSON.parseविधि पुराने पुराने ब्राउज़रों में काम नहीं करेगी - इसलिए यदि आप अपनी वेबसाइट को किसी प्रकार के इंटरनेट कनेक्शन के माध्यम से उपलब्ध कराने की योजना बनाते हैं, तो यह एक समस्या हो सकती है! यदि आप वास्तव में रुचि रखते हैं, तो यहां एक समर्थन चार्ट है (जो मेरे सभी बॉक्स को टिक करता है)।


1
यदि वह एक पुस्तकालय का उपयोग करता है जो क्रॉस-ब्राउज़र पार्सजोन फ़ंक्शन का समर्थन करता है, तो उसे इसका उपयोग करना चाहिए। इसके अलावा, आप लूप की गलती दोहराते हैं।
बर्गी

जब मैं इसे चलाता हूं, तो मुझे पहली पंक्ति में एक त्रुटि मिलती है: अनटोक किए गए सिंटेक्स एरर: अनपेक्षित टोकन ओ
नाइट्स

@ रातें: यह सबसे अधिक संभावना है कि आपके पास एक अमान्य JSON स्ट्रिंग है, तो एक ऑनलाइन 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 (var counter in jsonData.counters) {
    console.log(jsonData.counters[counter].counter_name);
}

लेकिन जैसा कि काउंटर एक ऐरे है, आपको एक सामान्य फॉर-लूप का उपयोग करना होगा:

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

1

सर्वर डेटा के साथ बातचीत के लिए "सेन्चा रास्ता" Ext.data.Storeएक Ext.data.proxy.Proxy(इस मामले में Ext.data.proxy.Ajax) Ext.data.reader.JsonJSON-एन्कोडेड डेटा के साथ सुसज्जित (इस मामले में ) एक अनुमानित सेट कर रहा है , अन्य पाठक भी उपलब्ध हैं। सर्वर पर डेटा वापस लिखने 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()। आप स्टोर को किसी भी स्नेहा टच यूआई घटकों जैसे ग्रिड, सूचियों या रूपों में भी तार कर सकते हैं।



0

यह आकर्षण की तरह काम करता है!

इसलिए मैंने अपनी आवश्यकता के अनुसार कोड संपादित किया। और यहां परिवर्तन हैं: यह आईडी नंबर को पर्यावरण चर में प्रतिक्रिया से बचाएगा।

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
हो सकता है कि आप का मतलब कर सकते हैं जहां कहा चाहिए । हालाँकि यह बेहतर है यदि आप अपने कोड में अधिक विवरण / स्पष्टीकरण जोड़ते हैं, जो ओपी और अन्य लोगों की मदद करेगा जो एक ही प्रश्न रखते हैं।
19

आप थोड़ा यह भी बता सकते हैं कि आपने यह तरीका क्यों चुना ताकि उपयोगकर्ता थोड़ा और सीख ले। इससे इस उत्तर को बेहतर बनाने में मदद मिलेगी।
TsTeaTime

सबसे अधिक वोट वाले उत्तर ने इस सवाल का जवाब दिया लेकिन जब मैं इसका उपयोग करता हूं तो यह समझ में आता है कि यह पंक्ति 4 में गलत है: var काउंटर = jsonData.counters [i]; लेकिन मैं इसे बदलता हूं: var काउंटर = jsonData [i] .counters; और यह काम किया। इसलिए मैंने कहा कि इसके बजाय करना चाहिए।
महदी जलाली

0

बस एक सिर के रूप में ...

var data = JSON.parse(responseBody);

पदावनत कर दिया गया है ।

पोस्टमैन लर्निंग सेंटर अब सुझाव देता है

var jsonData = pm.response.json();

-1

आपको एक्स्टाज में एक डेटस्टोर और प्रॉक्सी का उपयोग करना चाहिए। इसके बहुत सारे उदाहरण हैं, और JSON रीडर आपके द्वारा निर्दिष्ट मॉडल में JSON संदेश को स्वचालित रूप से पार्स करता है।

ExtJs का उपयोग करते समय मूल जावास्क्रिप्ट का उपयोग करने की कोई आवश्यकता नहीं है, सब कुछ अलग है, आपको सब कुछ सही पाने के लिए ExtJs तरीके का उपयोग करना चाहिए। वहाँ प्रलेखन ध्यान से पढ़ें, यह अच्छा है।

वैसे, ये उदाहरण स्नेहा टच (विशेष रूप से v2) के लिए भी हैं, जो एक्सटीजे के समान मूल कार्यों पर आधारित है।


-1

सुनिश्चित नहीं है कि मेरा डेटा ठीक मेल खाता है, लेकिन मेरे पास JSON ऑब्जेक्ट्स के सरणियों की एक सरणी है, जो पृष्ठों का उपयोग करते समय jQuery के FormBuilder से निर्यात किया गया।

उम्मीद है कि मेरा जवाब किसी को भी मदद कर सकता है जो इस सवाल पर ठोकर खाता है, जो मेरे पास एक समस्या के जवाब की तलाश में है।

डेटा कुछ इस तरह से देखा गया:

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()+"]")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.