Как мне получить доступ к массиву JSON в JavaScript

#javascript #php #arrays #json #ajax

#javascript #php #массивы #json #ajax

Вопрос:

У меня есть PHP-скрипт, к которому я делаю Ajax-запрос, и большая его часть работает нормально, но у меня возникают проблемы с доступом к массиву данных, возвращаемых функцией JavaScript.

Итак, в PHP есть куча обычных переменных и один массив. Массив, $places, состоит из четырех элементов, каждый из которых имеет три значения, вот так:

 [["z","815","1"],["w","2813","0"],["s","1582","2"],["b","1220","5"]]
  

Соответствующий отрывок из PHP-скрипта является:

 $encoded_places = json_encode($places);  // if I don't do this then I end up with a value of "Array"
$qobject->name = "$name";
$qobject->multi = "$multi";
$qobject->places= "$encoded_places";

$myJSON = json_encode($qobject);
echo $myJSON;
  

В скрипте JavaScript (с использованием jQuery) я успешно получаю данные из запроса Ajax, и я могу получить доступ ко всем данным нормально, за исключением данных $ places.

  $.getJSON(url, function(data, status){

   var stringified = JSON.stringify(data);
   var parsedObj = JSON.parse(stringified);

   var x = parsedObj.name; // alert(x);  // which works fine

   var myArray = new Array();
   myArray.push(parsedObj.places);

   for(var i = 0; i < myArray.length; i  ){
        console.log(myArray[i]);
   }
  

… и консоль отобразит то, что я ожидаю, а именно:

 [["z","815","1"],["w","2813","0"],["s","1582","2"],["b","1220","5"]]
  

Однако у меня возникают трудности с доступом к этим значениям. Например, предположим, что я пытаюсь получить доступ к части «815» первого элемента, используя что-то вроде: myArray[0][1], все, что я получаю, это «[«.

Я предполагаю, что каким-то образом весь этот фрагмент данных представляет собой просто строку, а не массив, но я недостаточно знаком с JavaScript, чтобы точно знать, как продвигаться.

Если, например, я сделаю это в скрипте JavaScript (надеясь увидеть 815, 2813, 1582 и 1220 в предупреждениях), все, что я увижу, это единственное предупреждение с «[«. (т. Е. Цикл выполняется только один раз и выбирается символ в позиции 1).

 for(var i = 0; i < myArray.length; i  ){
    console.log(myArray[i]);
    alert(myArray[i][1]);                                                                                                             
}
  

Я был бы очень признателен, если бы кто-нибудь объяснил:
(a) как я могу получить доступ к отдельным элементам и значениям в JS
(б) как я могу перебирать их, хотя предположительно, если это массив, а не строка, то приведенный выше код должен это делать.

Большое спасибо за любую помощь.

Теперь решено: как отметил @charlietfl, ниже, используя кавычки в

 $qobject->places= "$encoded_places";
  

облажался, наряду с использованием json_encode в $ places. Однако без удаления кавычек ничего не работало в любом случае. Итак, убрал кавычки и просто использовал json_encode для всей структуры в конце, которая теперь работает нормально.

Итак, исходный фрагмент кода, приведенный выше, теперь выглядит так:

 $qobject->name = $name;
$qobject->multi = $multi;
$qobject->places= $places;

$myJSON = json_encode($qobject);
echo $myJSON;
  

Комментарии:

1. Что console.log(typeof parsedObj.places) вам дает? Кроме того, вам не нужно создавать новый, Array поскольку кажется, что это уже массив, и myArray.push просто переместит весь этот массив в первую позицию нового Array , не уверен, что это то, что вы хотите.

2. Не json_encode $places. Просто позвольте $myJSON = json_encode($qobject); выполнить всю сериализацию. При анализе вы получаете вложенную строку json вместо массива, который, по вашему мнению, вы получаете

3. console.log(typeof parsedObj.places); // Строка

4. Тогда вам следует сделать var myArray = JSON.parse(parsedObj.places) — в конечном счете проблема связана с тем, что упомянул @charlietfl

5. @goto1 Синтаксический анализ выполняется внутри с $.getJSON

Ответ №1:

Изменить

 $qobject->places = "$encoded_places";
  

Для

 $qobject->places = $places;
  

И избавиться от $encoded_places = json_encode($places); , чтобы один вызов json_encode сериализовал всю структуру

Комментарии:

1. Спасибо, но если я избавлюсь от бита $ encoded_places и получу только один вызов json_encode, сериализующий всю структуру, то мне, похоже, еще хуже, поскольку вместо того, чтобы предоставлять какие-либо данные вообще, console.log(myArray[i]) просто выдает «Array» (а не строку значений), а console.log(typeof parsedObj.places) по-прежнему выдает «String».

2. Как print_r($places) выглядит? И вы процитировали "$places" , потому что это было бы неверно

3. Хороший вызов с кавычками! Да, это именно то, что было. Без внесения каких-либо изменений я смог заставить его работать, удалив кавычки из «$ encoded_places». Большое спасибо!!! Не уверен, как / если я могу принять ваш комментарий в качестве ответа, но я очень признателен. Спасибо. Позже проверю наличие любых других комментариев.

4. По-прежнему не должны нуждаться в encoded_places и должны иметь возможность только json_encode один раз

5. Верно; Я вижу, что я использовал $places , а не $ encoded_places при тестировании кавычек, и поэтому да, я думаю, что это вторая вещь, которую я изменил; итак, никаких кавычек и только один json_encode перед выводом. Еще раз спасибо.

Ответ №2:

Попробуйте это:

 $.getJSON(url, function(data, status){
  var parsedObj = JSON.parse(stringified);

  console.table(parsedObj.places);
  console.log(parsedObj.places)[0][0];
}
  

В getJSON контексте data опубликованного кода это уже строка JSON. Итак, эта строка избыточно строит вашу строку JSON:

 var stringified = JSON.stringify(data);
  

stringified теперь установлена буквальная / экранированная версия допустимой строки JSON из data параметра:

   [["z","815","1"],["w","2813","0"],["s","1582","2"],["b","1220","5"]]
  

Когда это значение с двойной строкой передается в JSON.parse для parsedObj ссылки, оно просто снова становится исходной строкой JSON (которая выглядит обманчиво корректной в окне предупреждения).

Строки в JavaScript можно повторять, поэтому цикл for просто перебирал строку.

Комментарии:

1. Для меня это имеет некоторый смысл, особенно скрытая итерация строки, но у меня это не работает из-за «Неперехваченной синтаксической ошибки: неожиданный токен o в JSON в позиции 1» … это напоминает мне о том, как я закончил тем, что сделал с JSON.stringify (data) / JSON.parse(stringified), который был указан как исправление этой ошибки здесь: thisinterestsme.com/fix-unexpected-token-o-in-json

2. О, я понимаю. В этом случае быстрым решением может быть сохранение оригинала stringify и повторное использование parse . Но лучшим решением было бы убедиться, что PHP в первую очередь возвращает правильно сформированную строку JSON.