2013-06-06 6 views
2

Я пытаюсь получить JSON и получить доступ к его объектам для извлечения данных, все мои пути, кажется, работают хорошо, но один специально не работает. Я только что проверил, и путь тот же, что и другие объекты, к которым я пытаюсь получить доступ, в консоли я все время становлюсь неопределенным. я буду признателен, если вы, ребята, можете сказать мне, что не так с кодом, я оставлю вас структурой JSON, а также java Scripti надеюсь, что вы, ребята, можете помочь мне разобраться, а также было бы хорошо, если бы вы могли дать мне несколько советов по моей кодировке потому что я учусь.Получение undefined при попытке получить член JSON

Java Script: Эта функция вызывается, когда вы нажимаете на какой-либо элемент в списке.

function checkUser(){ 
    console.log("clicked"); 
    var user = $(this).html(); 
    $.getJSON("js/options.json", function(json){ 
     var itemsLength = json.chat.OnlineContacts.length; 
     for (var i = 0; i < itemsLength; i++) { 
      var jsonUserName = json.chat.OnlineContacts[i].name; 
      var jsonUserStatus = json.chat.OnlineContacts[i].status; 
      var jsonUserAvatar = json.chat.OnlineContacts[i].avatar; 
      if(user == jsonUserName){ 
       /*displayChatWindow(jsonUserName, jsonUserStatus, jsonUserAvatar);*/ 
       console.log(jsonUserAvatar); 
      } 
     }; 
    }); 
} 

function displayChatWindow(user, status, avatar){ 
    /*var template = _.template($("#windowTemplate").html(), {userName: user, userStatus: status, userAvatar: avatar}); 
    $("body").prepend(template);*/ 
    $(".messages-container").slimScroll({ 
     height: '200', 
     size: '10px', 
     position: 'right', 
     color: '#535a61', 
     alwaysVisible: false, 
     distance: '0', 
     railVisible: true, 
      railColor: '#222', 
     railOpacity: 0.3, 
     wheelStep: 10, 
     disableFadeOut: false, 
     start: "bottom"  
    }); 
} 

И это JSON:

{ 
"chat": { 
    "NumberOfOnlineContacts": "7", 
    "NumberOfOfflineContacts": "800", 
    "OnlineContacts": [ 
     { 
      "name": "Nandy Torres", 
      "status": "online", 
      "avatar": "img/profile-picture2.jpg" 
     }, 
     { 
      "name": "Catherine Varela", 
      "status": "Busy", 
      "avatar": "img/profile-picture3.jpg" 
     }, 
     { 
      "name": "Jhonnatan Gonzalez", 
      "status": "online", 
      "avatar": "img/profile-picture4.jpg" 
     }, 
     { 
      "name": "Juan Prieto", 
      "status": "away", 
      "avatar": "img/profile-picture5.jpg" 
     }, 
     { 
      "name": "Alexander Barranco", 
      "status": "Busy", 
      "avatar": "img/profile-picture6.jpg" 
     } 
    ], 
    "OfflineContacts": [ 
     { 
      "name": "Nandy Torres" 
     }, 
     { 
      "name": "Catherine Varela" 
     }, 
     { 
      "name": "Jhonnatan Gonzalez" 
     }, 
     { 
      "name": "Juan Prieto" 
     }, 
     { 
      "name": "Jhonathan Sanchez" 
     } 
    ] 
} 
} 

Когда я пытаюсь сделать журнал консоли на аватаре, как в примере, я просто получить неопределен, но если я делать console.log имени или status y просто получите правильные значения.

+1

* Какой * путь не работает? Пожалуйста, будьте конкретны в своих вопросах. –

+0

@ExplosionPills Я считаю 'json.chat.OnlineContacts [i].аватар' - это путь, который не работает, судя по инструкции 'console.log()'. –

+0

Да, я прав, я просто уточнил в конце вопроса «Когда я пытаюсь сделать запись в консоли, как в примере, я просто получаю undefined, но если я делаю console.log имени или статуса, то просто получаю правильный значения." если я изменю имя в JSON на изображение, а также путь к картинке, я получу console.log, но если я не буду комментировать строки, которые я прокомментировал, то получаю сообщение об ошибке: ReferenceError: jsonUserAvatar не определен. –

ответ

2

Рассмотрите возможность реструктуризации оригинального объекта JSON, чтобы вы могли получить доступ к пользователям напрямую по их уникальному идентификатору - в этом случае оно выглядит как «имя».

Например:

{ 
    "chat": { 
     "NumberOfOnlineContacts": "7", 
     "NumberOfOfflineContacts": "800", 
     "OnlineContacts": [ 
      { 
       "Nandy Torres" : { 
        "status": "online", 
        "avatar": "img/profile-picture2.jpg" 
       } 
      }, 
      { 
       "Catherine Varela" : { 
        "status": "Busy", 
        "avatar": "img/profile-picture3.jpg" 
       } 
      }, 
      {...} 
     ] 
    } 
} 

Это может быть доступ к следующим образом, не за счет цикла:

json.chat.OnlineContacts[0].avatar 
json.chat.OnlineContacts["Nandy Torres"].avatar 
json.chat.OnlineContacts[user].avatar 

Там очевидная затрат и здесь, но вы можете получить лучшее как путем обозначения «имени» attr:

"Nandy Torres" : { 
    "name": "Nandy Torres", 
    "status": "online", 
    "avatar": "img/profile-picture2.jpg" 
} 

И, в конечном итоге, переход к более f НПУ уникальный идентификатор:

"123abc" : { 
    "name": "Nandy Torres", 
    "status": "online", 
    "avatar": "img/profile-picture2.jpg" 
} 

Там много отличных идей для структурирования JSON в json.com

+1

Ничего себе, это действительно здорово, потому что то, что я делаю, считается «масштабируемым», поэтому организация JSON таким образом будет действительно здорово держать его в самом деле организованным в будущем. –

+0

Отличный пост! Я определенно рекомендую начинать с уникального идентификатора в самом начале, хотя - я не думаю, что вы хотите зависеть от уникальных имен людей. И, кстати, сегодня мы должны быть на какой-то психической длине волны, потому что раньше я рекомендовал [аналогичную реструктуризацию JSON] (http://stackoverflow.com/questions/16970265/find-json-nested-nodes-using-multiple-string -значения/16971541 # 16971541). –

+0

Спасибо, Майкл, и очень важно начать с уникального идентификатора! Давайте продолжим психическую длину волны :) –

2

Jhonnatan, я рад, что вы получили ваш код работает. Так что это не «ответ» на ваш оригинальный вопрос. Но вы также попросили совета по кодированию и как его улучшить. Это здорово, что вы ищете способы улучшить свой код!

Вот одно предложение для вас, более простой способ записи функции checkUser(). Это просто прямое преобразование вашей функции, которая должна работать с одним и тем же форматом данных.

function checkUser() { 
    console.log("clicked"); 
    var user = $(this).html(); 
    $.getJSON("js/options.json", function(json) { 
     $.each(json.chat.OnlineContacts, function(i, contact) { 
      if(user == contact.name) { 
       displayChatWindow(contact.name, contact.status, contact.avatar); 
       console.log(contact.avatar); 
      } 
     }); 
    }); 
} 

Обратите внимание, как использование contact объекта делает ненужным создавать все эти jsonUserXxxx переменные, так как код, как contact.avatar так же просто и ясно, как jsonUserAvatar.

Я также очень рекомендую @DaveRomero's excellent answer для более стратегического взгляда на вопрос о том, как лучше структурировать данные JSON.

Дополнительная информация по этому вопросу: this discussion of JSON restructuring, который я опубликовал сегодня в ответ на this question.

+0

Привет, Майкл, спасибо, что нашли время ответить, а также добавить все материалы и примеры :). когда вы обращаетесь к объекту, я задал вопрос. Как «contact.avatar», как я могу преобразовать json, я получаю $ .getJSON в объект, например contact = {}, как вы сказали. Я действительно не понимаю, как преобразовать все данные в json в объект или $, каждый из которых делает это для меня? Прошу прощения, если вопрос не на 100% понятен, английский не является моим основным lenguage, поэтому я делаю отличный блеск. –

+1

@JhonnatanGonzalezRodriguez - Да, '$ .each' предоставляет объект' contact' для его функции обратного вызова. В вашем исходном коде 'json.chat.OnlineContacts' уже является массивом объектов' contact', правильно? Вот почему вы можете использовать 'json.chat.OnlineContacts [i]', чтобы добраться до одного из этих объектов, или 'json.chat.OnlineContacts [i] .avatar', чтобы добраться до одного аватара. '$ .each' просто перебирает массив для вас и вызывает вложенную функцию обратного вызова для каждого элемента массива, передавая ему индекс массива и значение массива - объект' contact' - в качестве параметров. (И BTW ваш английский очень хорош!) –

Смежные вопросы