Javascript วิธีแยกวิเคราะห์อาร์เรย์ JSON


93

ฉันใช้ 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);
 }

ผมทำอะไรผิดหรือเปล่า ? ขอบคุณ!


คำตอบ:


142

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

นี่คือตัวอย่างการทำงาน

แก้ไข : มีข้อผิดพลาดในการใช้สำหรับการวนซ้ำ (ฉันพลาดสิ่งนี้ในการอ่านครั้งแรกให้เครดิตกับ @Evert for the spot) การใช้ for-in loop จะกำหนดให้ var เป็นชื่อคุณสมบัติของลูปปัจจุบันไม่ใช่ข้อมูลจริง ดูลูปที่อัปเดตของฉันด้านบนเพื่อการใช้งานที่ถูกต้อง

สำคัญ : JSON.parseวิธีนี้จะใช้ไม่ได้กับเบราว์เซอร์รุ่นเก่าดังนั้นหากคุณวางแผนที่จะทำให้เว็บไซต์ของคุณพร้อมใช้งานผ่านการเชื่อมต่ออินเทอร์เน็ตแบบดัดเวลาบางอย่างอาจเป็นปัญหาได้! หากคุณสนใจจริงๆนี่คือแผนภูมิสนับสนุน (ซึ่งทำเครื่องหมายในช่องทั้งหมดของฉัน)


1
ถ้าเขาใช้ไลบรารีที่รองรับฟังก์ชัน parseJSON แบบข้ามเบราว์เซอร์เขาควรใช้สิ่งนั้น นอกจากนี้คุณทำซ้ำข้อผิดพลาดของลูป
Bergi

ฉันได้รับข้อผิดพลาดในบรรทัดแรกเมื่อฉันเรียกใช้สิ่งนี้: Uncaught SyntaxError: โทเค็นที่ไม่คาดคิด o
คืน

@nights: นั่นเป็นไปได้มากว่าคุณมีสตริง 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-in-loop ตัวแปรที่กำลังรันจะเก็บชื่อคุณสมบัติไม่ใช่ค่าคุณสมบัติ

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

แต่เนื่องจากตัวนับเป็น Array คุณจึงต้องใช้ for-loop ปกติ:

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

1

"วิธี Sencha" สำหรับการโต้ตอบกับข้อมูลเซิร์ฟเวอร์กำลังตั้งค่าExt.data.Storeพร็อกซีโดย a Ext.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()ซ้ำได้โดยการโทร คุณยังสามารถเชื่อมต่อร้านค้ากับส่วนประกอบ UI ที่เหมาะสมของ Sencha Touch เช่นกริดรายการหรือแบบฟอร์ม



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 และคนอื่น ๆ ที่มีคำถามเดียวกันได้ดีขึ้น
ติ๋ว

คุณยังสามารถอธิบายได้เล็กน้อยว่าเหตุใดคุณจึงเลือกวิธีนี้เพื่อให้ผู้ใช้เรียนรู้มากขึ้น ซึ่งจะช่วยปรับปรุงคำตอบนี้
TsTeaTime

คำตอบที่มีผู้โหวตมากที่สุดตอบคำถามนี้ แต่เมื่อฉันใช้มันเข้าใจว่าผิดในบรรทัดที่ 4: var counter = jsonData.counters [i]; แต่ฉันเปลี่ยนเป็น: var counter = jsonData [i] .counters; และมันได้ผล ดังนั้นฉันจึงบอกว่าสามารถแทนที่จะเป็นควร
Mahdi Jalali

0

เป็นเพียงหัวขึ้น ...

var data = JSON.parse(responseBody);

ได้รับการเลิกใช้

Postman Learning Center แนะนำแล้ว

var jsonData = pm.response.json();

-1

คุณควรใช้ที่เก็บข้อมูลและพร็อกซีใน ExtJs มีตัวอย่างมากมายและโปรแกรมอ่าน JSON จะแยกวิเคราะห์ข้อความ JSON ในรูปแบบที่คุณระบุโดยอัตโนมัติ

ไม่จำเป็นต้องใช้ Javascript พื้นฐานเมื่อใช้ ExtJs ทุกอย่างแตกต่างกันคุณควรใช้วิธี ExtJs เพื่อให้ทุกอย่างถูกต้อง อ่านเอกสารที่นั่นอย่างละเอียดก็ดี

อย่างไรก็ตามตัวอย่างเหล่านี้ยังมีไว้สำหรับ Sencha Touch (โดยเฉพาะ v2) ซึ่งใช้ฟังก์ชันหลักเดียวกันกับ ExtJs


-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()+"]")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.