Допустимый JSON, но не может отображать элементы массива

0

Я работаю над этим довольно долго, и я прочитал TONS сообщений на SO, пытаясь понять, как мне нужно это делать, и я не могу заставить его работать. Я думаю, что это должен быть какой-то аспект того, как я закодировал вещи. Так опускайте вниз, но, надеюсь, какая-то душа поможет мне.

Я тестировал с помощью jsonlint, который возвращается. Я получаю ответ от сервера со значениями, я просто не могу ничего получить в браузере, кроме как когда я просто предупреждаю (ответ) ;. Мне нужно иметь возможность получить доступ к значению "cat_id_PK" и другим элементам отдельно для прокрутки и отображения их в ячейках таблицы html.

JSON:

{
"income": [
    {
        "cat_id_PK": 14,
        "cat_name": "test1",
        "cat_amount": "100.00"
    },
    {
        "cat_id_PK": 15,
        "cat_name": "test2",
        "cat_amount": "200.00"
    },
    {
        "cat_id_PK": 34,
        "cat_name": "test3",
        "cat_amount": "300.00"
    },
"expense": [
    {
        "cat_id_PK": 14,
        "cat_name": "tes41",
        "cat_amount": "400.00"
    },
    {
        "cat_id_PK": 15,
        "cat_name": "test5",
        "cat_amount": "500.00"
    },
    {
        "cat_id_PK": 34,
        "cat_name": "test6",
        "cat_amount": "600.00"
    }
]
}

PHP

    $array = array(
        'income'    => $income,
        'expense'   => $expense,
        'recurring' => $recurring
    );

    echo json_encode($array);

Jquery

var request = $.ajax({
    type: "POST",
    url: 'inc/functions.php',
dataType: "JSON",
    data: {action: "display_categories", cur_month:cur_month}
});
request.done(function(response){
     //for each element put values in <td></td> tags.
});
  • 0
    где вы получаете доступ к своему ответу JSON? из .success() или .done() ?
  • 0
    Покажите нам весь вызов ajax и какой тип данных вы используете.
Показать ещё 9 комментариев
Теги:
arrays
multidimensional-array

2 ответа

1
Лучший ответ

"Я тестировал с помощью jsonlint, который возвращается".

Нет, это не так, а не для JSON, который вы указали, который имеет ошибку: он не имеет закрытия ] после } и перед запятой в строке до "expense" :... Но, возможно, это просто опечатка в вашем вопросе, учитывая, что вы создаете JSON с помощью json_encode() (что не приведет к такой ошибке).

"Я просто не могу ничего получить в браузере, кроме как когда я просто alert(response);

Тогда вы получаете какую-то ценность.

"но если я просто предупредил response[0], он вернет только первый символ массива JSON".

Да, это потому, что response - это строка - необработанная строка, содержащая JSON, где то, что вы хотите, - это проанализировать эту строку, чтобы получить объект. За исключением того, что вам не нужно делать это вручную, потому что jQuery будет делать это автоматически, как только вы добавите dataType:"json" в ваши $.ajax().

"Я действительно отсутствовал в этом типе данных, но даже после его добавления, независимо от того, что я пытаюсь, я получаю [Object:Object] или undefined. Я буквально ничего не делаю, кроме как alert(response);

Когда вы добавите dataType:"json" параметр response будет объектом, который при попытке оповещения будет корректно отображаться как [object Object]. Если вы используете console.log(response) то в консоли браузера вы увидите фактический объект. Если вы попытаетесь получить доступ к свойству, которое не существует, вы получите undefined.

"Мне нужно иметь доступ к значению cat_id_PK и другим элементам отдельно для циклического cat_id_PK и отображения их в ячейках таблицы html".

Объект response имеет два свойства, income и expenses, оба из которых являются массивами объекта. Поэтому используйте response.income для доступа к первому массиву объектов и response.expenses для доступа ко второму массиву объектов. Первый элемент дохода - response.income[0] а свойство, о котором вы просили, - response.income[0].cat_id_PK. Таким образом, вы можете использовать цикл for или использовать $.each() для итерации по массиву и сделать что-то с каждым свойством .cat_id_PK:

var request = $.ajax({
    type: "POST",
    url: 'inc/functions.php',
    dataType: "json",
    data: {action: "display_categories", cur_month:cur_month}
});
request.done(function(response){
  //for each element put values in <td></td> tags.
  var tr = $("<tr></tr>");
  // using traditional for loop for income items
  for(var i = 0; i < response.income.length; i++) {
    $("<td></td>").text(response.income[i].cat_id_PK).appendTo(tr);
  }
  tr.appendTo("#idOfTableHere");
  var tr = $("<tr></tr>");
  // use equivalent jQuery $.each for expense items
  $.each(response.expenses, function(i, v) {
    $("<td></td>").text(v.cat_id_PK).appendTo(tr);
  });
  tr.appendTo("#idOfTableHere");
});

Код, который я показал, создает новые td-элементы в каждом цикле, добавляя их к новым строкам таблицы, а затем после каждого цикла новая строка добавляется в таблицу, которую я предположил, уже существует на вашей странице с id="idOfTableHere",

  • 0
    Отличный ответ и исчерпывающее решение, которое я понимаю гораздо больше, чем все посты SO, которые я читал на эту тему. БЛАГОДАРЮ ВАС!!! Единственное, в чем я не уверен при внедрении вашего кода, я бы хотел установить cat_id_PK в качестве идентификатора для элементов <td>. Я пытаюсь разобраться, как бы я это сделал с твоим решением выше.
  • 1
    $("<td id='" + response.income[i].cat_id_PK + "'></td>").text("some text here").etc... или $("<td></td>", { id : response.income[i].cat_id_PK }).etc... следует это сделать.
0

попробуйте это, вы пропустите dataType:

var request = $.ajax({
    type: "POST",
    url: 'inc/functions.php',
    data: {action: "display_categories", cur_month:cur_month},
    dataType:"json",
});
request.done(function(response){
     //for each element put values in <td></td> tags.
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню