web-dev-qa-db-fra.com

Vérifier si un élément existe dans json

en utilisant le flux suivant:

http://api.Twitter.com/1/statuses/user_timeline.json?screen_name=Microsoft&include_rts=1&count=10

Je suis parvenu à parcourir cette page avec succès pour obtenir les détails que je souhaite afficher sur ma page html.

Cependant, je dois vérifier si retweeted_status.user.profile_image_url existe et je ne sais pas comment faire cela.

Actuellement, je suis en train de parcourir les données où data est renvoyé par jquery-ajax:

data[i].retweeted_status.user.profile_image_url

si data[i].retweeted_status.user.profile_image_url n'existe pas, il ne retourne pas null ou undefined, j'obtiens simplement l'erreur suivante:

cannot read property 'user' of undefined

10
oshirowanen

Ce message d'erreur suggère que vos données [i] ou votre statut retweeté ne sont pas définies, ce qui signifie que votre appel pour obtenir le JSON est probablement en train d'échouer. Lorsque les données sont renvoyées de Twitter, elles ont toujours une url d’image de profil, car elles affichent une image ressemblant à un œuf pour celles qui n’ont pas été téléchargées. Vous devriez mettre ceci avant votre boucle:

if (typeof(retweeted_status) != "undefined")
{
//code for what to do with json here
}
28
Liam Bailey

Je pense que c'est une bonne réponse:

if('key' in myObj)
9
z_inx
if (something !== undefined) {
   ...
}

... ou même mieux:

if (typeof something != "undefined") {
    ...
}
1

Si vous faites une boucle et accédez à des objets imbriqués:

if(!data)
    return;

while(data.length)
{
    var Tweet_data = data.shift();

    /* do some work */

    if(!Tweet_data|| !Tweet_data.retweeted_status)
        continue;

    var retweeted_status = Tweet_data.retweeted_status;

    /* do your other work */
}

Cette boucle n'a plus besoin d'utiliser des index de tableau, ce qui n'est pas le plus efficace sauf si vous avez spécifiquement besoin de l'index. Au lieu de cela, il extrait le premier élément du tableau et utilise directement cet objet. Les internes de la boucle peuvent alors vérifier l'existence d'une propriété sur Tweet_data.

J'essaie d'éviter d'utiliser plus d'un niveau de déréférencement pour 2 raisons (comme objA.child.property): 1) Vous pouvez vérifier l'existence d'un objet dès le départ et, s'il n'existe pas, sauter ou attribuer des valeurs par défaut. values. 2) Chaque fois que JavaScript doit accéder à la méthode property, il doit d'abord rechercher child avec objA puis accéder à property. Pourrait être lent dans les grandes boucles.

0
Dino Gambone

Une autre chose que vous pouvez faire, qui a fonctionné pour moi:

if(retweeted_status) {
  // your code
}
0
Max Stern

Jetez un coup d'oeil à $ .grep () . Il vous aide à parcourir les objets JSON. Je l'ai utilisé sur le lien que vous avez fourni. Je l'ai utilisé pour parcourir les tweets et trouver les images utilisateur retweetées. Vous pouvez consulter mon code ici: http://jsfiddle.net/q5sqU/7/

0
Chris Marais