json parse error with double quotes

PhpJavascriptJsonParsingDouble Quotes

Php Problem Overview


A double quote even if escaped is throwing parse error.
look at the code below

//parse the json in javascript  
var testJson = '{"result": ["lunch", "\"Show\""] }';  
var tags = JSON.parse(testJson);  
alert (tags.result[1]);

This is throwing parse error because of the double quotes (which are already escaped).
Even eval() won't work here.
But if i escape it with double slashes like this:

var result = '{"result": ["lunch", "\\"Show\\""] }';  
var tags = JSON.parse(result);  
alert (tags.result[1]);

then it works fine.
Why do we need to use double slash here in javascript? The problem is that PHP json_encode() function escapes a double quote with a single slash (like this: \"show\") which JSON.parse won't be able to parse. How do i handle this situation?

Php Solutions


Solution 1 - Php

Javascript unescapes its strings and json unescapes them as well. the first string ( '{"result": ["lunch", "\"Show\""] }' ) is seen by the json parser as {"result": ["lunch", ""Show""] }, because \" in javascript means ", but doesn't exit the double quoted string.

The second string '{"result": ["lunch", "\\\"Show\\\""] }' gets first unescaped to {"result": ["lunch", "\"Show\""] } (and that is correctly unescaped by json).

I think, that '{"result": ["lunch", "\\"Show\\""] }' should work too.

Solution 2 - Php

Well, finally, JSON's parse uses the same eval, so there's no difference when you give them smth. with incorrect syntax. In this case you have to escape correctly your quotes in php, and then escape them and their escaping slashes with json_encode

<?php
    $json = '{"result": ["lunch", "\"Show\""] }';
    echo json_encode($json);
?>

OUTPUT: "{\"result\": [\"lunch\", \"\\\"Show\\\"\"] }"

This should work on client-side JS (if I've made no typos).

Solution 3 - Php

This problem is caused by the two-folded string escaping mechanism: one comes from JS and one comes from JSON.

A combination of the backslash character combined with another following character is used to represent one character that is not otherwise representable within the string. ''\\'' stands for '' etc.

This escaping mechanism takes place before JSON.parse() works.

For Example,

var parsedObj = JSON.parse('{"sentence": "It is one backslash(\\\\)"}');
console.log(parsedObj.sentence);
>>>"It is one backslash(\)"

From the string generator's perspective, it passes four backlashes '' into the JavaScript interpretor.

From the JavaScript interpretor's perspective, it inteprets there are two backlashes(\) as each '\\' sequence will be interpreted as one ''.

From the JSON parser's perspective, it receives two backlashes(\\) and the JSON string escape rules will parses it as one single '' which is the output result.

Explain you first code:

var testJson = '{"result": ["lunch", "\"Show\""] }';
//The real string after sequence escaping in to JS is
//'{"result": ["lunch", ""Show""] }' 
//which is passed into the JSON.parse.
//Thus, it breaks the JSON grammar and generates an error
var tags = JSON.parse(testJson);  
alert (tags.result[1]);

Solution 4 - Php

From the docs

> JSON_HEX_APOS (integer) All ' are converted to \u0027
> JSON_HEX_QUOT (integer) All " are converted to \u0022

json_encode() takes two args, the value and options. So try

json_encode($result, JSON_HEX_QUOT); // or
json_encode($result, JSON_HEX_QUOT | JSON_HEX_APOS);

I haven't tried this though.

Solution 5 - Php

php to javascript Object (php >= 5.3.0)

var storesLocations = JSON.parse('<?php echo addslashes(json_encode($storesLocations,JSON_HEX_APOS | JSON_HEX_QUOT)) ?>');

Solution 6 - Php

Turn off magic_quotes_gpc in php.ini.

Solution 7 - Php

If the standard C escapes are added, then JSON.parse will convert sequences like \" into ", \\ into \, \n into a line-feed, etc.

'foo\\bar\nbaz"' === JSON.parse('"foo\\\\bar\\nbaz\\""')

In our project's case:

original string ""{\"lat\":28.4594965,\"lng\":77.0266383}""

After passing to JSON.parse()

"{"lat":28.4594965,"lng":77.0266383}"

On 2nd pass to JSON.parse()

{lat: 28.4594965, lng: 77.0266383}

Notice that JSON.parse() removed escaping characters instead of converting string to object.

After the escaping characters were removed, the string to object conversion worked.

Here is the demo:

while (typeof p1 != 'object') {
  p1 = JSON.parse(p1);
  pass++;
  console.log('On pass ', pass, p1);
}

Solution 8 - Php

This might help:

<?php
$json = '{"result": ["lunch", "\"Show\""] }';
echo addslashes(json_encode($json));

Solution 9 - Php

Try This. and then try commented

<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<pre><?php ($_POST)?print_r($_POST):'' ?></pre>

<form method="POST">
	<input type="text" name="name"><br>
	<input type="email" name="email"><br>
	<input type="time" name="time"><br>
	<input type="date" name="date"><br>
	<input type="hidden" name="id"><br>
	<textarea name="detail"></textarea>
	<input type="submit" value="Submit"><br>
</form>
<?php 
/* data */
$data = [
	    	'name'=>'vinay"'."'\\\\",
		    'email'=>'[email protected]',
		    'time'=>date('H:i:00'),
		    'date'=>date('Y-m-d'),
		    'detail'=>'Try this var_dump(0=="ZERO") \\ \\"'." ' \\\\	",
		    'id'=>123,
		];
?>
<span style="display: none;" class="ajax-data"><?=json_encode($data)?></span>
<script type="text/javascript">
    /* Error */
	// var json = JSON.parse('<?=json_encode($data)?>');
    /* Error solved */
	var json = JSON.parse($('.ajax-data').html());
	console.log(json)
    /* automatically assigned value by name attr */
	for(x in json){
		$('[name="'+x+'"]').val(json[x]);
	}
</script>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionVarunView Question on Stackoverflow
Solution 1 - PhpcubeView Answer on Stackoverflow
Solution 2 - PhpJetView Answer on Stackoverflow
Solution 3 - PhpsteveyangView Answer on Stackoverflow
Solution 4 - PhpÓlafur WaageView Answer on Stackoverflow
Solution 5 - PhpvalirView Answer on Stackoverflow
Solution 6 - PhptheoView Answer on Stackoverflow
Solution 7 - PhpxameeramirView Answer on Stackoverflow
Solution 8 - PhpShahroqView Answer on Stackoverflow
Solution 9 - PhpvinayView Answer on Stackoverflow