2013-11-24 7 views
0

Как получить доступ к этому массиву JSON с помощью jQuery? Я в настоящее время обрабатывается массив из API в console.log(), который отображается в этом форматеЧтение разобранного ответа JSON

Object {already_liked: false, media_id: "1234567890", likeResult: Object} 
    already_liked: false 
    likeResult: Object 
     data: null 
     meta: Object 
      code: 200 
      __proto__: Object 
     __proto__: Object 
    media_id: "1234567890" 
    __proto__: Object 

Я получаю этот ответ от запроса AJAX, который отформатирован таким образом

$.get('/likemedia', { 
    mediaid: $(this).data("id") 
}, function(data){ 
    console.log(data.html); 
}, 'json'); 

Отклик от /likemedia форматируется таким образом

{"html":{"already_liked":false,"media_id":"1234567890","likeResult":{"meta":{"code":200},"data":null}}} 

затем я попытался acessing ключ JSON массив из «мета [„код“]», используя этот формат

data.html.likeResult.meta.code 

Какой должен был быть полезен, как я могу получить значение 'data.likeResult.meta.code'?

я попытался сделать следующее, что приводит к ней метанию массива в console.log

if (data.html.likeResult.meta.code === "200") { 
    alert("200 META CODE!"); 
} else { 
    console.log(data.html); 
} 
+1

Извините, но вывод вашего заявления console.log, который вы вставили здесь, не имеет смысла, он неполный. Нам нужно увидеть структуру объекта, если мы хотим вам помочь. –

+0

Почему 'data.html'? –

+0

Я пошел дальше и добавил дополнительную информацию о том, почему это может быть проблемой – Curtis

ответ

1

Вы делаете чек типа и-значения на Number типа, сравнивая его в строку , Это всегда будет оцениваться до false. Когда вы относитесь к типу, проверки типов и значений - это то, что я поощряю и значительно улучшаю, но когда вы работаете с JSON, я бы просто не принял тип. Вместо этого я бы либо писать:

if (data.html.likeResult.meta.code == 200) 

или пойти:

if (+(data.html.likeResult.meta.code) === 200)//explicitly coercing to number 

В любом случае, я бы также проверить объект перед доступом, что многие вложенные свойства:

if (data.hasOwnProperty('html')) 
{ 
} 

Чтобы избежать ошибок при доступе к несуществующему свойству, которое завершило бы весь ваш скрипт.
Возможно, эта функция может помочь вам в этом:

function checkObject(obj, properties) 
{ 
    var i, data = obj; 
    for (i=0;i<properties.length;++i) 
    { 
     if (!data.hasOwnProperty(properties[i])) 
     { 
      return undefined; 
      //or throw {'Property: ' + properties[i] + ' not found' , i} 
     } 
     data = data[properties[i]]; 
    } 
    return data; 
} 

Это обеспечивает более безопасный подход к объектам JSON, ИМО. В вашем случае вы можете вызвать эту функцию следующим образом:

var meta = checkObject(data, ['html','likeResult','meta','code']); 
if (!meta) 
{//one of the properties wasn't available, deal with that here 
} 
//all was well, so now: 
if (meta.code == 200) 
{//... 
} 
+0

* «при работе с JSON я бы не просто принял тип» * Если вы работаете с соответствующим API, почему бы и нет? –

+0

@FelixKling: несколько причин: если вы не контролируете API, а поставщик услуг решает использовать другую библиотеку для форматированных данных JSON, и этот lib просто слепо цитирует все, включая ints, тогда строгая проверка не будет Помогите. Если вы _do_ управляете API, скорее всего, он разрабатывается вместе с JS-кодом, который его вызывает, если кто-то находит это свойство _meta_ полезным для перекачки других неожиданных данных, таких как дата, в ваш код, опять же, , В принципе, это данные, которые у вас нет полного контроля, поэтому я бы избегал проверки как строгой, так как JS позволяет вам ... –

+0

Отличная предоставленная информация, большое вам спасибо – Curtis

2

Вы правильно доступ к данным, но вы делаете строгие сравнения ряда против строки. Это всегда false. Строгое сравнение означает, что тип данных обоих значений также должен совпадать. Таким образом, сравните с числом вместо:

data.html.likeResult.meta.code === 200 

вместо этого.

Вы можете ясно видеть, что code это число, потому что значение не в двойных кавычках:

{"code":200} 
Смежные вопросы