Как читать JSON (ответ сервера) в Javascript?

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

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

Для этого кода я получаю "null".

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

Ответ 1

Если вы пытаетесь использовать формат 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; .... 
}

Ответ 2

Объекты 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]);
    }
}

EDIT: Если вы не можете изменить данные на сервере, вы можете создать свою собственную клиентскую сторону объекта. Это также помогает, если вам нужно обратиться к нескольким столбцам (что вы, вероятно, делаете).

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, потому что я неправильно читаю. Я оставлю это для вас, чтобы выяснить, как обрабатывать другие.

Ответ 4

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

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

Ответ 5

Если вы попытаетесь выяснить, как читать из [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))
    })

Ответ 6

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