Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaScript breaks when there is a double quote in returned JSON [duplicate]

I'm creating a JSON string from a PHP array. I've encoded it using json_encode().

$data = array(
    'title' => 'Example string\'s with "special" characters'
);

$data = json_encode( $data );

$data is localized using wp_localize_script() and is accessible via a global data variable.

In the JS file I can access the information by the following:

var data     = data.replace( /"/g, '"' ),
    jsonData = jQuery.parseJSON( data );

console.log( jsonData );

This results in an output of:

{ "title":"Example string's with "special" characters" }

Entering that result into http://jsonlint.com/ returns an error. Removing the double quotes around "special" validates the string.

What is the best way to create a JSON string from PHP and properly escape it for use in a JS file?

like image 549
Luke Avatar asked Sep 18 '11 15:09

Luke


People also ask

How do you escape a double quote in JSON?

However if you intend to use a backslash in an escape sequence, obviously you shouldn't escape it. Show activity on this post. if you want to escape double quote in JSON use \\ to escape it.

Can you use double quotes inside a JSON string?

JSON. Yes, if you use the ascii code.

Does JSON require double quotes?

JSON names require double quotes.

Does JSON support double?

JSON numbers follow JavaScript's double-precision floating-point format.


2 Answers

Another way would be to encode the quotes using htmlspecialchars:

$json_array = array(
    'title' => 'Example string\'s with "special" characters'
);

$json_decode = htmlspecialchars(json_encode($json_array), ENT_QUOTES, 'UTF-8');
like image 142
Danny Thompson Avatar answered Sep 19 '22 16:09

Danny Thompson


I succefully just did this :

$json = str_replace("\u0022","\\\\\"",json_encode( $phpArray,JSON_HEX_QUOT)); 

json_encode() by default will escape " to \" . But it's still wrong JSON for json.PARSE(). So by adding option JSON_HEX_QUOT, json_encode() will replace " with \u0022. json.PARSE() still will not like \u0022. So then we need to replace \u0022 with \\". The \\\\\" is escaped \\".

NOTE : you can add option JSON_HEX_APOS to replace single quote with unicode HEX value if you have javascript single quote issue.

ex: json_encode( $phpArray, JSON_HEX_APOS|JSON_HEX_QUOT ));

like image 41
Grégoire Lafortune Avatar answered Sep 19 '22 16:09

Grégoire Lafortune