HTML breaks JSON

4,413 views
Skip to first unread message

Matt

unread,
Apr 24, 2009, 11:30:41 AM4/24/09
to Prototype & script.aculo.us
Hi there,

I'm using PHP to output some JSON through AJAX to my page. It breaks
whenever I use a backslash or quote mark.

I've tried using php's json_encode function which doesn't seem to
help, just breaks it further. I've also tried php's addslashes() to
the output, again, same problem.

Am I approaching this correctly, fundamentally? Is JSON supposed to
contain HTML?

Thanks,

Matt

Ananth Raghuraman

unread,
Apr 24, 2009, 12:05:13 PM4/24/09
to prototype-s...@googlegroups.com
JSON should not contain HTML for tactical/ease of programming purposes unless the HTML is there as part of a larger design, but there may or may not be implementation restrictions.
If you are facing problems, can you try encoding the HTML string (Base64) and decoding back (using Javascript Base64 code ) before display on the browser?

T.J. Crowder

unread,
Apr 24, 2009, 12:26:54 PM4/24/09
to Prototype & script.aculo.us
@Ananth:

Converting to Base64 would be massive overkill, surely.

@OP:

There's no reason you can't include strings containing HTML in JSON
data. You just have to make sure your strings are valid string
literals, like this:

{
message: "<p>This is HTML.</p>"
}

There's nothing special other than making sure the HTML is correctly
escaped -- e.g., if you're putting the JSON string in double quotes,
naturally any double quotes in the HTML will need a backslash in front
of them -- as, for that matter, will any backslashes!

HTH,
--
T.J. Crowder
tj / crowder software / com

On Apr 24, 5:05 pm, Ananth Raghuraman <araghuram...@gmail.com> wrote:
> JSON should not contain HTML for tactical/ease of programming purposes
> unless the HTML is there as part of a larger design, but there may or may
> not be implementation restrictions.
> If you are facing problems, can you try encoding the HTML string (Base64)
> and decoding back (using Javascript Base64 code ) before display on the
> browser?
>

Matt Foster

unread,
Apr 24, 2009, 4:54:45 PM4/24/09
to Prototype & script.aculo.us
What are you sending to PHP's json_encode? It is expecting a
structure to serialize into a JSON syntax string.

$struct = array("message" => "<h1>Hello World</h1>Who says we can't
have any kind of \"quotes\" we want?");

echo json_encode($struct);

If you try to run json_encode on your already JSONified string, yeah
its going to cause problems...


--

http://positionabsolute.net

Matt

unread,
Jun 4, 2009, 11:30:48 AM6/4/09
to Prototype & script.aculo.us
Hi again,

I've been running addslashes() on the input before running json_encode
() and it still creates problems when I pass it through AJAX - breaks
HTML tags etc. If I turn addslashes() off, any occurence of "" in the
body text (eg quotes from speakers etc) breaks the code again. Does
anyone have a foolproof method?

Cheers
Matt

Alex McAuley

unread,
Jun 4, 2009, 12:24:46 PM6/4/09
to prototype-s...@googlegroups.com
You need to do it a bit differently with php json_encode/decode ... i had
this problem when i first started using it....

where you send post data (JSON) as p


$post=str_replace('\"', '"', $_POST['p']);
$json=$post;
$d=json_decode($json,true);

foreach($d as $key=>$val) { ...... do what you will with it after this
unless you know the key names !!


This should do the trick for you

HTH

ALex

Matt

unread,
Jun 5, 2009, 5:05:25 AM6/5/09
to Prototype & script.aculo.us
Hi Alex,

Still didn't work for me :( Just produced broken HTML output again.

On Jun 4, 5:24 pm, "Alex McAuley" <webmas...@thecarmarketplace.com>
wrote:

Szymon Wilkołazki

unread,
Jun 5, 2009, 5:31:56 AM6/5/09
to prototype-s...@googlegroups.com
Matt wrote:
> Hi Alex,
>
> Still didn't work for me :( Just produced broken HTML output again.
>

If your html code is not broken on inside of php variable, then it
won't break anything inside json_encode;

[code]
<?php
$html = '
<div id="someId">this is correct html
<span id=\'singleQuote\'>
You have to escape single Quotes
FOR PHP SAKE ONLY.
If you get the HTML from file, or from
database, then NO ESCAPING is needed.
You need to escape quotes only for PHP
parser, just as in any string.
</span>
</div>';
$json = json_encode($html);
echo $json;
?>
[/code]
//produces:
"\n <div id=\"someId\">this is correct html\n <span
id='singleQuote'>\n You have to escape single Quotes \n
FOR PHP SAKE ONLY. \n If you get the HTML from
file, or from \n database, then NO ESCAPING is needed. \n
You need to escape quotes only for PHP \n
parser, just as in any string.\n <\/span>\n <\/div>"

Json_encode() function does EVERYTHING that is needed to escape the
javascript strings, you do not need to have any kind of add_slashes().
In fact, add_slashes will break things, as the slashes will be escaped
by json_encode() funciton, and they will be visible in html.


Take a look if you have not over-escaped the html. You might have
magic-quotes enabled which automagicly adds slashes for you. This is
evil option, as you have little control over what is happening.

Hope this helps

> On Jun 4, 5:24 pm, "Alex McAuley" <webmas...@thecarmarketplace.com>
> wrote:
>> You need to do it a bit differently with php json_encode/decode ... i had
>> this problem when i first started using it....
>>
>> where you send post data (JSON) as p
>>
>> $post=str_replace('\"', '"', $_POST['p']);
>> $json=$post;
>> $d=json_decode($json,true);
>>
>> foreach($d as $key=>$val) { ...... do what you will with it after this
>> unless you know the key names !!

I totally do not understand what you are doing here. Could you explain
a little bit?

P.S. It is much easier to read posts if everyone would ansver below or
inline of the previous post, not "Top-Post". Just like T.J. Crowder did.

--
Best Regards,
SWilk

Alex McAuley

unread,
Jun 5, 2009, 6:16:34 AM6/5/09
to prototype-s...@googlegroups.com
very strange .. works for me with anything all the time

Matt Foster

unread,
Jun 8, 2009, 11:00:56 AM6/8/09
to Prototype & script.aculo.us
You guys are crazy...you send json_encode an object, not a string!!

http://us3.php.net/manual/en/function.json-encode.php

--

http://positionabsolute.net


On Jun 5, 6:16 am, "Alex McAuley" <webmas...@thecarmarketplace.com>
wrote:

Walter Lee Davis

unread,
Jun 8, 2009, 11:05:25 AM6/8/09
to prototype-s...@googlegroups.com
From your example page, under Parameters:

value
The value being encoded. Can be any type except a resource.

That means it can be an Array, an Object, a String, an Integer, a
Boolean, a Floating Point Number or NULL, according to this list of
Types:

http://us3.php.net/manual/en/language.types.resource.php



Walter

Walter Lee Davis

unread,
Jun 8, 2009, 11:06:41 AM6/8/09
to prototype-s...@googlegroups.com
Sorry, here's a clearer listing:

http://us3.php.net/manual/en/language.types.intro.php

Walter

Richard Quadling

unread,
Jun 8, 2009, 12:19:14 PM6/8/09
to prototype-s...@googlegroups.com
2009/6/8 Walter Lee Davis <wa...@wdstudio.com>:
Sending PHP's json_encode anything other than an array is pointless.

http://bugs.php.net/bug.php?id=38680

--
-----
Richard Quadling
Zend Certified Engineer : http://zend.com/zce.php?c=ZEND002498&r=213474731
"Standing on the shoulders of some very clever giants!"
Reply all
Reply to author
Forward
0 new messages