Создание многоуровневого JSON

Вопрос:У меня есть массив объектов, каждый из которых содержит массив Location и Links с неопределенной длиной. Как создать многоуровневый объект JSON с циклами? Конец JSON должен выглядеть как item1: [ { "location": [ {"latitude": value, "longitude": value, "stopNum": value, "fileName": value } ], "links": [ {"latitude": value, "longitude": value, "stopNum": value, "fileName": value }, {"latitude":

Вопрос:

У меня есть массив объектов, каждый из которых содержит массив 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

Оцените статью
Добавить комментарий