11

I'm trying to write my JSON object to a .json file on the server. The way I'm doing this now is:

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);
?>

It is writing fine and the information seems to be correct, but it is not rendering properly. It is coming out as:

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

... but I'm expecting this:

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

Why am I getting all of these slashes and why it is all on one line?

asked Oct 13, 2010 at 7:18
1
  • Are you using a framework or performing any sanitization in POST before hand, try turning magic_qoutes of in php ini and restart. Commented Oct 13, 2010 at 12:23

4 Answers 4

21

You are double-encoding. There is no need to encode in JS and PHP, just do it on one side, and just do it once.

// 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)
 }
});

Note that the dataType parameter denotes the expected response type, not the the type you send the data as. Post requests will be sent as application/x-www-form-urlencoded by default.

I don't think you need that parameter at all. You could trim that down to:

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

Then (in PHP) do:

<?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 
 }
?>
answered Oct 13, 2010 at 7:32
Sign up to request clarification or add additional context in comments.

1 Comment

should'nt be fwrite($file, $json); ??
5

Don't JSON.stringify. You get a double JSON encoding by doing that.

You first convert your array elements to a JSON string, then you add them to your full object, and then you encode your big object, but when encoding the elements already encoded are treated as simple strings so all the special chars are escaped. You need to have one big object and encode it just once. The encoder will take care of the children.

For the on row problem try sending a JSON data type header: Content-type: text/json I think (didn't google for it). But rendering will depend only on your browser. Also it may be possible to encode with indentation.

answered Oct 13, 2010 at 7:21

4 Comments

I guess that worked... I thought I need to do JSON.stringify so that it formats my object properly? I defined a toJSON function for my object so that is why i was using stringify. I took it out and it got rid of the \\\ but it is still all on one line...
@Hristo: What's wrong with all of it being on one line? I don't think you should care.
He may need to check if while in development and this might help him. If it's just for storing there's nothing wrong.
jsonlint.com does that better than visually scanning a formatted string.
4

Probably too late to answer the question. But I encountered the same issue. I resolved it by using "JSON_PRETTY_PRINT"

Following is my code:

<?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";
}
?>
answered Sep 6, 2016 at 16:11

Comments

0
<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"
 }
 ]
 }
answered Aug 23, 2016 at 1:57

1 Comment

evrything you need in one file,this is the most inefficient code i've ever writeen in my life ,but it solves ur problem!

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.