Запись объекта 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
    } ,

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


person Hristo    schedule 13.10.2010    source источник
comment
Используете ли вы фреймворк или выполняете какую-либо очистку в POST заранее, попробуйте включить magic_qoutes в php ini и перезапустить.   -  person RobertPitt    schedule 13.10.2010


Ответы (4)


Вы используете двойное кодирование. Нет необходимости кодировать 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 
   }
?>
person Tomalak    schedule 13.10.2010
comment
не должно быть fwrite($file, $json); ?? - person Francesco; 14.05.2011

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

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

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

person Alin Purcaru    schedule 13.10.2010
comment
Я думаю, это сработало... Я подумал, что мне нужно сделать JSON.stringify, чтобы он правильно отформатировал мой объект? Я определил функцию toJSON для своего объекта, поэтому я использовал stringify. Я вынул его, и он избавился от \\\, но все равно все в одной строке... - person Hristo; 13.10.2010
comment
@Hristo: Что плохого в том, что все это находится в одной строке? Я не думаю, что вас должно это волновать. - person Tomalak; 13.10.2010
comment
Возможно, ему понадобится проверить, находится ли он в разработке, и это может ему помочь. Если только для хранения, то ничего страшного. - person Alin Purcaru; 13.10.2010
comment
jsonlint.com делает это лучше, чем визуальное сканирование отформатированной строки. - person Tomalak; 13.10.2010

Наверное, уже поздно отвечать на вопрос. Но я столкнулся с той же проблемой. Я решил это, используя "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";
}
?>
person Suveer Jacob    schedule 06.09.2016

<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 i.e $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"
  }
    ]
  }
person sudheer    schedule 23.08.2016
comment
все, что вам нужно, в одном файле, это самый неэффективный код, который я когда-либо писал в своей жизни, но он решает вашу проблему! - person sudheer; 23.08.2016