web-dev-qa-db-fra.com

Comment lire JSON (réponse du serveur) en Javascript?

J'envoie une requête sur un serveur et sa réponse est la suivante:

{"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"]]}

J'ai essayé beaucoup mais rien ne semble fonctionner pour moi!

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

Pour ce code je reçois "null".

Toute aide serait appréciée!

15
BlackM

Si vous essayez d'utiliser le format JSON, votre problème est que les données du [...] doivent également être par paires et regroupées dans {...} comme ici .

Par exemple,

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

Donc vous pourriez avoir:

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

Si le serveur vous envoie quelque chose que vous appelez res, vous pouvez simplement le faire pour l'analyser dans votre Javascript:

var o=JSON.parse(res);

Vous pouvez ensuite parcourir chaque instance dans les colonnes comme suit:

for (var i=0;i<o.COLUMNS.length;i++)
{  
        var date = o.COLUMNS[i].REGISTRATION_DT; .... 
}
6
Nick

voir ce lien. LIRE LA RÉPONSE JSON

C'est parfait.

4
Umar Asghar

Les objets JSON fonctionnent comme n'importe quel objet javascript ou dictionnaire ordinaire

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

Dans votre cas, COLUMNS et data sont tous deux des tableaux. Il semble donc que vous tentiez d'obtenir l'élément à partir des données correspondant à l'élément "FNAME" dans 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: Si vous ne pouvez pas modifier les données côté serveur, vous pouvez créer votre propre objet côté client. Cela aide également si vous devez faire référence à plusieurs colonnes (ce que vous faites probablement).

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

Plus modifier: Mes réponses ne considèrent que la première ligne de données, parce que j'ai mal interprété à l'origine. Je vous laisse le soin de déterminer comment traiter les autres.

3
Mike Ruhlin

Lors du test de votre code dans http://jsonlint.com/ , il est indiqué que la réponse de votre serveur n'est pas une chaîne JSON valide. 

De plus, je recommande de vérifier jQuery.parseJSONhttp://api.jquery.com/jQuery.parseJSON/

1
Stanislav Palatnik

Si vous êtes arrivé ici, essayez de lire comment lire [Response object] (comme je l'ai fait) -.__ Voici ce qui peut aider: - si vous utilisez fetch, n'oubliez pas res.json() avant de vous connecter à la console

fetch(`http://localhost:3000/data/${hour}`, {
        method: 'get'
    })
    .then(res => {
        return res.json()
      })
    .then((response) => {
        console.log('res: ' + JSON.stringify(response))
    })
1
KamilaS

Il suffit d'utiliser JSON.parse(serverResponse)

0
Alberto Camargo