2010-12-12 2 views
6

Я создаю приложение ajax с помощью jQuery 1.4.2, и я попытался использовать с помощью методов get(), post() и ajax(). Моя возвращает сервис PHP:Доступ к данным json из jquery

[{"k":"label0","v":0.5},{"k":"label1","v":99.43},{"k":"label2","v":2.46},{"k":"label3","v":46.29},{"status":"OK"}] 

в моем успехе обратного вызова я попытался доступа, как json.status и JSON [0] [0] , но она всегда возвращает "неопределенный". Что я делаю не так?

function getSysinfo(source) { 
    var json = null; 
    $.ajax({ 
     url: source, 
     type: 'POST', 
     dataType: 'json', 
     success: function (data) { 
      json = eval("(" + data + ")"); 
      $('#data').html(json.status); 
      alert(json[0][0]); 
      refreshChart(json); 
     }, 
     error: function (request, status, error) { 
      alert("REQUEST:\t" + request + "\nSTATUS:\t" + status + 
        "\nERROR:\t" + error); 
     } 
    }); 
    return json; 
} 

Я искал это в течение нескольких дней. Как я могу получить доступ к возвращенным данным? любая помощь будет оценена по достоинству.

+0

я дал некоторый ответ, который может быть использован в вашем случае, уже есть способы availbe как getJSON, который заботится о все проблемы, и вы можете просто пройти через – kobe

ответ

6

Для доступа к этому значению статуса вам потребуется:

data[4].status 

Это происходит потому, что объект находится в пятом элементе в массиве, где status является свойством объекта.

+0

ahh - хорошо, что имеет немного больше смысла ... Мне действительно не очень понравился элемент статуса. Мне нужны пары k/v. Я действительно экспериментировал ... и думал, что данные [1] .v и данные [1] [1] являются синонимами. Thanx. – WWWIZARDS

5

В вашем успехе обратного вызова попытки:

var parsed = $.parseJSON(data); 
$.each(parsed, function (i, jsondata) { 
    alert(jsondata.k); 
    alert(jsondata.v); 
}); 
+0

@lorezo, нам нужно пройти все элементы правильно? что делает .k и .v дает ??? – kobe

+0

@gov: вы правы! Я пропустил часть цикла. Отредактированный ответ, чтобы отразить это – Lorenzo

+0

Вам не нужно разбирать json, как это, jQuery уже проанализировал его. – andynormancx

4

Вам не нужно eval("("+data+")");. Jquery автоматически разборе ответ JSON для вас, потому что вы указали dataType:'json'

Из документов JQuery для DATATYPE:

«JSON»: Оценивает ответ как JSON и возвращает объект JavaScript. В jQuery 1.4 данные JSON обрабатываются строгим образом; любой отклоненный JSON отклоняется и возникает ошибка синтаксического анализа. (См json.org для получения дополнительной информации о правильном форматировании JSON.)

+1

NO. ПЛОХО. 'JSON.parse()'. Не используйте 'eval' для JSON. ПЛОХО. – mattbasta

+2

Я не сторонник использования eval. Я просто говорю, что он ему не нужен. Также JSON.parse не поддерживается всеми браузерами (особенно более старыми). Использование чего-то вроде $ .parseJSON, которое делает обоснованное решение на основе браузера, вероятно, лучше. – nategood

+0

Я согласен с частью eval(), я просто не был уверен, что происходит под капотом. Некоторые вещи, которые я искал, были несколько лет назад. Я узнал, что он построил jQuery 1.4, поэтому мне понадобится только его, если мой поток был type = 'text' .. но я буду больше смотреть в parseJSON(). – WWWIZARDS

2

нет необходимости использовать Eval больше использовать ниже код, который может быть больше для JSON

$.getJSON(url+query,function(json){ 
      $.each(json,function(i,value){ 

      }); 
     }); 
+0

Это не нужно, код в вопросе уже будет разбираться с json совершенно счастливо. Также $ .getJSON может использоваться только для запросов GET, а не POST, поскольку вопрос используется. – andynormancx

+0

да, мне нужен POST & ajax() также дает большую гибкость с параметрами. Спасибо за ответ, хотя ... – WWWIZARDS

0

nategood уже писал, что вы не» Не нужно ничего делать с данными, это уже объект.

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

data[data.length-1].status 

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

Нечто подобное:

{ 
"items":[ 
     {"k":"label0","v":0.5}, 
     {"k":"label1","v":99.43}, 
     {"k":"label2","v":2.46}, 
     {"k":"label3","v":46.29} 
     ], 
"status":"OK" 
} 

... должно быть проще в обращении, потому что вы можете просто получить доступ к data.status вместо первого ищет, где вы можете найти его в ответ (что может быть error- склонный).

+0

Мне было все равно 2 о статусе, но пары k/v ... Я подумал, что, возможно, это было необходимо для ответа на запуск разбора. Я пытался использовать его во что-то похожее на вашу структуру, но непреднамеренно сделал и array_push ($ jsonData, array ("status" => 'OK')); - на стороне php. В любом случае, мне нужна номенклатура для доступа к массиву правильно ... – WWWIZARDS

+0

Я ДЕЙСТВИТЕЛЬНО ценю вашу помощь. – WWWIZARDS

7

Ваш JSON-данных выглядит следующим образом:

[ 
    { 
     "k": "label0", 
     "v": 0.5 
    }, 
    { 
     "k": "label1", 
     "v": 99.43 
    }, 
    { 
     "k": "label2", 
     "v": 2.46 
    }, 
    { 
     "k": "label3", 
     "v": 46.29 
    }, 
    { 
     "status": "OK" 
    } 
] 

Вы должны прочитать свой статус с помощью

json[4].status 

с 4 как магическое число или length-1 - не желательно.Я хотел бы рассмотреть вопрос об изменении вашего ответа сервера на что-то более полезное, например так:

{ 
    "status": "OK", 
    "entries": [ ... ] // add your data here 
} 
Смежные вопросы