Как разобрать строку json в объект javascript - PullRequest
4 голосов
/ 06 сентября 2010

У меня есть такая строка JSON:

{"total":"3","data":[{"id":"4242","title":"Yeah Lets Go!","created":"1274700584","created_formated":"2010-07-24 13:19:24","path":"http:\/\/domain.com\/yeah"}{"id":"4242","title":"Yeah Lets Go!222","created":"1274700584","created_formated":"2010-07-24 13:19:24","path":"http:\/\/domain.com\/yeah222"}{"id":"4242","title":"Yeah Lets Go!333","created":"1274700584","created_formated":"2010-07-24 13:19:24","path":"http:\/\/domain.com\/yeah333"}]}

Мне нужно разобрать его в объекте javascript, я верю? А затем в HTML вроде:

<a href="http:www..domain.com/yeah">Yeah Lets Go!</a>
<p class="date">Created: 2010-07-24 13:19:24"</p>

но я понятия не имею, как разобрать его и так далее.

Я получаю эту строку из этого:

$('a.link').click(function() {
var item_id = $(this).attr("href").split('#')[1];
$.get(base_url+'/ajax/get_itema/'+item_id+'/0/3/true', null, function(data, status, xhr) {
$('#contentCell').html(data);
});

Ответы [ 6 ]

5 голосов
/ 06 сентября 2010

Используйте функцию JSON.parse для преобразования строки JSON в объект JS.Большинство современных браузеров включают JSON.parse, но оно также включено в json2.js , если вам нужен запасной вариант для старых браузеров.

3 голосов
/ 06 сентября 2010

Имеет div с идентификатором result, чтобы получить HTML, что-то вроде:

$.getJSON(base_url+'/ajax/get_itema/'+item_id+'/0/3/true', function(data) {
    $("#result").empty();
    $.each(data.data, function(i, d) {
        $("#result").append("<a href='" + d.path + "'>" + d.title + "</a>" + 
            "<p class='date'>Created: " + d.created_formated + "</p>");
    }
});
3 голосов
/ 06 сентября 2010

Поскольку вы используете jQuery, взгляните на .getJSON()

То, как вы используете .getJSON():

jQuery.getJSON( url, [ data ], [ callback(data, textStatus) ] )

url - это, конечно, url, с которого вы получаете данные. [ data ] - это то, что вы отправляете на сервер. [ callback(data, textStatus) ] - это функция, которая обрабатывает data возвращение с сервера. Вы можете вообще пропустить второй аргумент textStatus. Возвращаемые данные понимаются как JSON. .getJSON() является сокращением для вызова .ajax(), который указывает данные JSON.

Так что в вашем случае это будет что-то вроде (обратите внимание, что я изменил JSON, возвращающийся с сервера на response ... это менее запутанная номенклатура в вашем случае, чем использование data, так как у вас есть data свойство в вашем JSON):

$.getJSON(base_url+'/ajax/get_itema/'+item_id+'/0/3/true', function(response) {
    ...
});

Итак, чтобы восстановить вещи из response, мы просто обращаемся к ним, используя точечные и квадратные скобки. Чтобы получить первый набор data:

response.data[0].title \\ <== "Yeah Lets Go!"
response.data[0].path \\ <== "http://domain.com/yeah"

Выше показано в response, который является нашим объектом JSON. Затем он смотрит на первый data элемент (их 3) и выбирает title в первой строке и path во второй.

Поскольку вы используете jQuery, вы можете использовать .each() для итерации по вашим 3 data. Как это:

$.each(response.data, function(index, value) {
    $("body").append('<a href="' + value.path + '">' + value.title + '</a>');
    $("body").append('<p class="date">Created: ' + value.created_formated + 
      '</p><br />');
});

Пример jsFiddle

.each() разумно перебирает коллекцию предметов. Первый аргумент .each() - это объект, который вы хотите зациклить. Это response.data, а не просто response. Это потому, что мы хотим посмотреть на response.data[0], response.data[1] и response.data[2]. Второй аргумент .each() - это функция обратного вызова, или то, что мы хотим сделать с каждым из элементов, для которых мы выполняем итерацию. В функции обратного вызова первый аргумент автоматически является индексом элемента (0, 1 или 2 в вашем случае). Второй аргумент - это стоимость предмета. В вашем случае это отдельный объект: response.data[0], response.data[1] и response.data[2] соответственно. Мы можем использовать точечную запись, чтобы получить то, что нам нужно, непосредственно из этих объектов. В приведенном выше примере мы получаем доступ .path. .title и .created_formated от каждого из value с.

Это делает всю вашу функцию:

$.getJSON(base_url+'/ajax/get_itema/'+item_id+'/0/3/true', function(response) {
    $.each(response.data, function(index, value) {
        $("body").append('<a href="' + value.path + '">' + value.title + '</a>');
        $("body").append('<p class="date">Created: ' + value.created_formated + 
          '</p><br />');
    });                
});

Конечно, вы, вероятно, захотите добавить ответ к (а) конкретному элементу / элементам.

Вот хорошая информация об использовании .getJSON() для доступа к многомерным данным JSON из другого вопроса SO.

Вот некоторая общая информация о JSON в Javascript .


Примечание:

Вам нужны запятые между фигурными скобками!

У вас есть:

...p:\/\/domain.com\/yeah"}{"id":"4242","title"...

Вам нужно:

...p:\/\/domain.com\/yeah"}, {"id":"4242","title"...
1 голос
/ 07 сентября 2010

Я не нашел ни одного ответа, что данные, которые вы разместили, являются НЕ действительной строкой JSON . Вероятно, это ваша основная проблема и причина, по которой $.get не может преобразовать ответ сервера в объект. Объекты внутри массива данных должны быть разделены запятыми . Таким образом, данные должны выглядеть как

{
    "total": "3",
    "data": [
        {
            "id": "4242",
            "title": "Yeah Lets Go!",
            "created": "1274700584",
            "created_formated": "2010-07-24 13:19:24",
            "path": "http:\/\/domain.com\/yeah" 
        },
        {
            "id": "4242",
            "title": "Yeah Lets Go!222",
            "created": "1274700584",
            "created_formated": "2010-07-24 13:19:24",
            "path": "http:\/\/domain.com\/yeah222" 
        },
        {
            "id": "4242",
            "title": "Yeah Lets Go!333",
            "created": "1274700584",
            "created_formated": "2010-07-24 13:19:24",
            "path": "http:\/\/domain.com\/yeah333" 
        } 
    ]
}

Рекомендую вам проверить верификацию строк JSON в http://www.jsonlint.com/.

0 голосов
/ 07 сентября 2010

по данным от Олега ответить

var json = {} // your json data reformated by Oleg

for (var i = 0; i < json.data.length; i++) {
    document.write('<a href="' + json.data[i].path.replace(/\\/g, '') + '">' + json.data[i].title + '</a>');
    document.write('<br>');
    document.write('<p class="date">Created: ' + json.data[i].created_formated +'</p>');
    document.write('<br>');
}

помните, что "данные" - это массив объектов

0 голосов
/ 06 сентября 2010

Попробуйте шаблонизатор, который преобразует JSON в HTML в браузере.

Вы можете взглянуть на pure.js , он очень быстрый и полностью очищает HTML от любой логики шаблонов Javascript. Мы используем его для генерации всего HTML-данных из JSON в нашем веб-приложении.

Если вы более знакомы с типами шаблонов <% ...%> или $ {...}, их много и на любой вкус, если вы будете искать в Интернете шаблон javascript .

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