доступ к данным JSON из JQuery - PullRequest
7 голосов
/ 13 декабря 2010

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

[{"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;
}

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

Ответы [ 7 ]

9 голосов
/ 13 декабря 2010

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

data[4].status

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

8 голосов
/ 13 декабря 2010

Ваши 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
}
6 голосов
/ 13 декабря 2010

В случае вашего успешного обратного вызова попробуйте:

var parsed = $.parseJSON(data);
$.each(parsed, function (i, jsondata) {
    alert( jsondata.k );
    alert( jsondata.v );
});
4 голосов
/ 13 декабря 2010

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

Из документов jQuery для dataType:

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

3 голосов
/ 13 декабря 2010

больше не нужно использовать eval, используйте приведенный ниже код, который может быть больше для json

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

            });
        });
1 голос
/ 13 декабря 2010

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 вместо того, чтобы сначала искать, где вы можете найти его внутри ответа (что может быть подвержено ошибкам).

0 голосов
/ 13 декабря 2010

Параметр данных является декодированным JSON, как вы можете видеть в этом примере:

http://www.jsfiddle.net/rLprV/1/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...