Вопрос:
У меня есть массив объектов, каждый из которых содержит массив Location и Links с неопределенной длиной. Как создать многоуровневый объект JSON с циклами?
Конец JSON должен выглядеть как
item1: [ { «location»: [ {«latitude»: value, «longitude»: value, «stopNum»: value, «fileName»: value } ], «links»: [ {«latitude»: value, «longitude»: value, «stopNum»: value, «fileName»: value }, {«latitude»: value, «longitude»: value, «stopNum»: value, «fileName»: value }, {«latitude»: value, «longitude»: value, «stopNum»: value, «fileName»: value } ] } ], item2: [ //repeat of above ]
Проблема, с которой я сталкиваюсь, – это правильно сформировать объекты. Объекты, которые содержит массив, определены как
function Links(){ this.location = null; this.links= []; function getLocation(){ return location; } function setLocation(marker){ this.location = marker; } function getLinks(){ return links; } }
Мое текущее решение
var json=[]; var linkData; for (var i=0; i < tourList.length; i++){ var data = tourList[i]; //create new child array for insertion var child=[]; //push location marker data child.push({ latitude: data.location.position.$a, longitude: data.location.position.ab, stopNum: i, filename: data.location.title }); //add associated link data for (var j=0; j<data.links.length; j++){ linkData = data.links[i]; child.push({ latitude: linkData.position.$a, longitude: linkData.position.ab, stopNum: i+j, fileName: linkData.title }); } //push to json array json.push(child); } //stringify the JSON and post results var results= JSON.stringify(json);
Однако это не совсем работает, поскольку
$post= json_decode($_POST[‘json’])
Оператор PHP возвращает неверный массив, где $post.length рассматривается как константа undefined. Я предполагаю, что это связано с неправильным форматированием.
С объектами, определенными выше, как я могу создать правильно сформированный JSON для отправки на сервер?
Текущий результат stringify() равен
[ {«latitude»:43.682211,»longitude»:-70.45070499999997,»stopNum»:0,»filename»:»../panos/photos/1-prefix_blended_fused.jpg»}, [ {«latitude»:43.6822,»longitude»:-70.45076899999998,»stopNum»:0,»fileName»:»../panos/photos/2-prefix_blended_fused.jpg»} ], {«latitude»:43.6822,»longitude»:-70.45076899999998,»stopNum»:1,»filename»:»../panos/photos/2-prefix_blended_fused.jpg»}, [ {«latitude»:43.68218,»longitude»:-70.45088699999997,»stopNum»:1,»fileName»:»../panos/photos/4-prefix_blended_fused.jpg»}, {«latitude»:43.68218,»longitude»:-70.45088699999997,»stopNum»:2,»fileName»:»../panos/photos/4-prefix_blended_fused.jpg»} ] ]
Кроме того, я использую $post.length в
$post = json_decode($POST[‘json’]); for ($i=0; $i<$post.length; $i++) { }
чтобы перебрать обработанный массив.
Запрос POST осуществляется через функцию jQuery.ajax(), определенную как
$.ajax({ type: «POST», url: «../includes/phpscripts.php?action=postTour», data: {«json»:results}, beforeSend: function(x){ if (x && x.overrideMimeType){ x.overrideMimeType(«application/json;charset=UTF-8»); } }, success: function(data){ if (data == «success») console.log(«Tour update successful»); else console.log(«Tour update failed»); } }); Лучший ответ:
Это должно работать.
var json = []; var linkData; for (var i = 0; i < tourList.length; i++) { var data = tourList[i]; //create new child array for insertion var child = [{ }]; //push location marker data child[0][‘location’] = [{ latitude: data.location.position.$a, longitude: data.location.position.ab, stopNum: i, filename: data.location.title }]; child[0][‘links’] = []; //add associated link data for (var j = 0; j < data.links.length; j++) { linkData = data.links[i]; child.links.push({ latitude: linkData.position.$a, longitude: linkData.position.ab, stopNum: i + j, fileName: linkData.title }); } //push to json array json.push(child); } //stringify the JSON and post results var results = JSON.stringify(json);
Но почему вы делаете вывод JSON настолько сложным? Более простым способом было бы использовать что-то вроде этого:
item1: { «location»: { «latitude»: value, «longitude»: value, «stopNum»: value, «fileName»: value }, «links»: [ {«latitude»: value, «longitude»: value, «stopNum»: value, «fileName»: value }, {«latitude»: value, «longitude»: value, «stopNum»: value, «fileName»: value }, {«latitude»: value, «longitude»: value, «stopNum»: value, «fileName»: value } ] }, item2: [ //repeat of above ]
Что вы делаете, так это создание “массивов” для отдельных объектов. Зачем это? Если вы используете этот формат, код (тонко) упрощается:
var json = []; var linkData; for (var i = 0; i < tourList.length; i++) { var data = tourList[i]; //create new child array for insertion var child = { }; //push location marker data child.location = { latitude: data.location.position.$a, longitude: data.location.position.ab, stopNum: i, filename: data.location.title }; child.links = []; //add associated link data for (var j = 0; j < data.links.length; j++) { linkData = data.links[i]; child.links.push({ latitude: linkData.position.$a, longitude: linkData.position.ab, stopNum: i + j, fileName: linkData.title }); } //push to json array json.push(child); } //stringify the JSON and post results var results = JSON.stringify(json); Ответ №1
Ответ, мой друг, JSON.stringfy():
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/stringify