[javascript] Javascript JSON 배열 구문 분석 방법

서버에서 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);
 }

내가 도대체 ​​뭘 잘못하고있는 겁니까 ? 감사합니다!



답변

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 루프 사용에 실수가 있습니다 (첫 번째 읽기에서 이것을 놓쳤습니다. for-in 루프를 사용하면 var가 실제 데이터가 아닌 현재 루프의 속성 이름으로 설정됩니다. 올바른 사용법은 위의 업데이트 된 루프를 참조하십시오.

중요 :이 JSON.parse방법은 오래된 오래된 브라우저에서는 작동하지 않습니다. 따라서 인터넷 연결을 구부리는 일종의 시간을 통해 웹 사이트를 사용할 수 있도록 계획하는 경우 문제가 될 수 있습니다! 그래도 관심이 있으시다면 여기에 지원 차트가 있습니다.


답변

이것이 내 대답입니다.

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


답변

for-in-loop에서 실행중인 변수는 속성 값이 아닌 속성 이름을 보유합니다.

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

그러나 카운터는 배열이므로 일반 for 루프를 사용해야합니다.

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


답변

서버 데이터와 상호 작용하기위한 “Sencha 방식”은 Ext.data.Storea 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(). 그리드, 목록 또는 양식과 같은 Sencha Touch 적절한 UI 구성 요소에 상점을 연결할 수도 있습니다.


답변

좀 더 요점을 ..

var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}';
var contact = JSON.parse(jsontext);
document.write(contact.surname + ", " + contact.firstname);
document.write(contact.phone[1]);
// Output:  
// Aaberg, Jesper  
// 555-0100

참조 :
https://docs.microsoft.com/en-us/scripting/javascript/reference/json-parse-function-javascript


답변

이것은 매력처럼 작동합니다!

그래서 내 요구 사항에 따라 코드를 편집했습니다. 변경 사항은 다음과 같습니다. 응답의 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);
}


답변

득표율이 높은 답변에는 실수가 있습니다. 내가 그것을 사용했을 때 나는 줄 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);
}