Как читать JSON (ответ сервера) в Javascript? - PullRequest
15 голосов
/ 18 марта 2012

Я отправляю запрос на сервер, и он отвечает мне:

{"COLUMNS":["REGISTRATION_DT","USERNAME","PASSWORD","FNAME","LNAME","EMAIL","MOBILE","FACEBOOK_ID"],"DATA":[["March, 17 2012 16:18:00","someuser",somepass,"somename","somesur","someemail",sometel,"someid"]]}

Я много пробовал, но, похоже, у меня ничего не получается!

var xml2 = this.responseData;
var xml3 = xml2.getElementsByTagName("data");
Ti.API.log(xml3.FNAME);

Для этого кода я получаю «ноль».

Любая помощь будет оценена!

Ответы [ 6 ]

7 голосов
/ 18 марта 2012

Если вы пытаетесь использовать формат JSON, ваша проблема в том, что данные в [...] также должны быть попарно и сгруппированы в {...}, как здесь .

Например,

{ 
      "sales": [ 
         { "firstname" : "John", "lastname" : "Brown" },
         { "firstname" : "Marc", "lastname" : "Johnson" }
      ] // end of sales array
    }

Таким образом, вы можете иметь:

{"COLUMNS": [ 
  {"REGISTRATION_DT" : "19901212", "USERNAME" : "kudos", "PASSWORD" : "tx91!#1", ... },
  {"REGISTRATION_DT" : "19940709", "USERNAME" : "jenny", "PASSWORD" : "fxuf#2", ... },
  {"REGISTRATION_DT" : "20070110", "USERNAME" : "benji12", "PASSWORD" : "rabbit19", ... }
 ]
}

Если сервер отправляет вам что-то, что вы называете res, вы можете просто сделать это дляпроанализируйте его в своем Javascript:

var o=JSON.parse(res);

Затем вы можете перебирать каждый экземпляр в столбцах следующим образом:

for (var i=0;i<o.COLUMNS.length;i++)
{  
        var date = o.COLUMNS[i].REGISTRATION_DT; .... 
}
4 голосов
/ 16 декабря 2016

см. Эту ссылку. ЧИТАЙТЕ ОТВЕТ JSON

Это прекрасно.

3 голосов
/ 18 марта 2012

Объекты JSON работают так же, как любые обычные объекты JavaScript или словари

// You can do it this way
var data = this.responseData["DATA"]
// Or this way
var data = this.responseData.DATA

В вашем случае, COLUMNS и данные являются массивами, так что похоже, что вы пытаетесь получить элемент из данных, который соответствует элементу "FNAME" в COLUMNS?

var columns = this.responseData["COLUMNS"];
var data = this.responseData["DATA"][0];

for(var i=0; i<columns.length; i++){
    if(columns[i] == "FNAME"){
        Ti.API.log(data[i]);
    }
}

РЕДАКТИРОВАТЬ: Если вы не можете изменить данные на стороне сервера, вы можете сделать свой собственный объект на стороне клиента. Это также помогает, если вам нужно сослаться на несколько столбцов (что вы, вероятно, делаете).

var columns = this.responseData["COLUMNS"];
var data = this.responseData["DATA"][0];
var realData = {};

for(var i=0; i<columns.length; i++){
    realData[columns[i]] = data[i];
}

// Now you can access properties directly by name.
Ti.API.log(data.FNAME);

Больше редактировать: Мои ответы учитывают только первую строку в DATA, потому что я неправильно прочитал изначально. Я оставлю это на ваше усмотрение, чтобы выяснить, как обрабатывать другие.

1 голос
/ 29 июля 2017

Если вы попали сюда, пытаясь узнать, как читать с [Response object] (как я сделал) - вот что может помочь: - если вы используете fetch, не забудьте о res.json() перед входом в консоль

fetch(`http://localhost:3000/data/${hour}`, {
        method: 'get'
    })
    .then(res => {
        return res.json()
      })
    .then((response) => {
        console.log('res: ' + JSON.stringify(response))
    })
1 голос
/ 18 марта 2012

Тестирование вашего кода в http://jsonlint.com/, говорит о том, что ответ вашего сервера не является допустимой строкой JSON.

Кроме того, я рекомендую проверить jQuery.parseJSON http://api.jquery.com/jQuery.parseJSON/

0 голосов
/ 19 августа 2017

Просто используйте JSON.parse(serverResponse)

...