запись объекта JSON в файл .json на сервере

Я пытаюсь написать свой объект JSON в файл .json на сервере. Теперь я делаю это так:

JavaScript:

function createJsonFile() { var jsonObject = { "metros" : [], "routes" : [] }; // write cities to JSON Object for ( var index = 0; index < graph.getVerticies().length; index++) { jsonObject.metros[index] = JSON.stringify(graph.getVertex(index).getData()); } // write routes to JSON Object for ( var index = 0; index < graph.getEdges().length; index++) { jsonObject.routes[index] = JSON.stringify(graph.getEdge(index)); } // some jQuery to write to file $.ajax({ type : "POST", url : "json.php", dataType : 'json', data : { json : jsonObject } }); }; 

PHP:

 <?php $json = $_POST['json']; $info = json_encode($json); $file = fopen('new_map_data.json','w+'); fwrite($file, $info); fclose($file); ?> 

Это хорошо написано, и информация кажется правильной, но она не отображается должным образом. Это выходит как:

 {"metros":["{\\\"code\\\":\\\"SCL\\\",\\\"name\\\":\\\"Santiago\\\",\\\"country\\\":\\\"CL\\\",\\\"continent\\\":\\\"South America\\\",\\\"timezone\\\":-4,\\\"coordinates\\\":{\\\"S\\\":33,\\\"W\\\":71},\\\"population\\\":6000000,\\\"region\\\":1}", 

… но я ожидаю этого:

 "metros" : [ { "code" : "SCL" , "name" : "Santiago" , "country" : "CL" , "continent" : "South America" , "timezone" : -4 , "coordinates" : {"S" : 33, "W" : 71} , "population" : 6000000 , "region" : 1 } , 

Любая идея, почему я получаю все эти черты и почему все это на одной линии?

Спасибо, Христо

Вы являетесь двойным кодированием. Нет необходимости кодировать в JS и PHP, просто делайте это с одной стороны и просто делайте это один раз.

 // step 1: build data structure var data = { metros: graph.getVerticies(), routes: graph.getEdges() } // step 2: convert data structure to JSON $.ajax({ type : "POST", url : "json.php", data : { json : JSON.stringify(data) } }); 

Обратите внимание, что параметр dataType обозначает ожидаемый тип ответа , а не тот тип, в котором вы отправляете данные. Почтовые запросы будут отправляться как application/x-www-form-urlencoded по умолчанию.

Я не думаю, что вам нужен этот параметр. Вы можете обрезать это до:

 $.post("json.php", {json : JSON.stringify(data)}); 

Затем (в PHP) выполните:

 <?php $json = $_POST['json']; /* sanity check */ if (json_decode($json) != null) { $file = fopen('new_map_data.json','w+'); fwrite($file, $json); fclose($file); } else { // user has posted invalid JSON, handle the error } ?> 

Не JSON.stringify . Сделав это, вы получаете двойную кодировку JSON.

Сначала вы преобразовываете элементы массива в строку JSON, затем добавляете их в свой полный объект, а затем кодируете свой большой объект, но при кодировании уже закодированных элементов рассматриваются как простые строки, поэтому все специальные символы экранируются. Вы должны иметь один большой объект и кодировать его только один раз. Кодер позаботится о детях.

Для проблемы с последовательной строкой попробуйте отправить заголовок типа JSON: Content-type: text/json Я думаю (не для Google для него). Но рендеринг будет зависеть только от вашего браузера. Также возможно кодирование с отступом.

Наверное, слишком поздно, чтобы ответить на вопрос. Но я столкнулся с той же проблемой. Я разрешил его, используя "JSON_PRETTY_PRINT"

Ниже приведен мой код:

 <?php if(isset($_POST['object'])) { $json = json_encode($_POST['object'],JSON_PRETTY_PRINT); $fp = fopen('results.json', 'w'); fwrite($fp, $json); fclose($fp); } else { echo "Object Not Received"; } ?> 
 <html> <head> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.3.min.js" ></script> </head> <body> <?php $str = file_get_contents('data.json');//get contents of your json file and store it in a string $arr = json_decode($str, true);//decode it $arrne['name'] = "sadaadad"; $arrne['password'] = "sadaadad"; $arrne['nickname'] = "sadaadad"; array_push( $arr['employees'], $arrne);//push contents to ur decoded array ie $arr $str = json_encode($arr); //now send evrything to ur data.json file using folowing code if (json_decode($str) != null) { $file = fopen('data.json','w'); fwrite($file, $str); fclose($file); } else { // invalid JSON, handle the error } ?> <form method=> </body> 

data.json

 { "employees":[ { "email":"11BD1A05G9", "password":"INTRODUCTION TO ANALYTICS", "nickname":4 }, { "email":"Betty", "password":"Layers", "nickname":4 }, { "email":"Carl", "password":"Louis", "nickname":4 }, { "name":"sadaadad", "password":"sadaadad", "nickname":"sadaadad" }, { "name":"sadaadad", "password":"sadaadad", "nickname":"sadaadad" }, { "name":"sadaadad", "password":"sadaadad", "nickname":"sadaadad" } ] }