parseJSON失败,而json_decode工作

Sau*_*ius 5 jquery json

我已经苦苦挣扎了一段时间,我有一个存储在DB中的字符串化JSON对象,一旦我检索它我用PHP和jQuery解码它,PHP工作正常,jQuery失败,继承人代码

var data = $.parseJSON('{"page_name":"Test page","page_title":"Test title","site":"0","page_url":"http:\/\/saulius.epickitdev.com\/test-page","page_type":"1","bg_type":"gradient","background_img_url":"","fill_bg_color":"","background_color":"","background_gradient_top":"5194c4","background_gradient_bottom":"000000","video_type":"yt","youtube_video_url":"","youtube_video_start_from":"","mp4_video_url":"","webm_video_url":"","ogg_video_url":"","width_type":"fixed","width_padding":"10","layout_color":"cc25cc","border_size":"3","border_color":"5a7de6","container_position":"middle","container_position_left":"","container_position_right":"","meta_title":"mtest","meta_description":"mdesc","meta_keyword":"mkey","fb_title":"ftitle","fb_description":"fdesc","header_script":{"1":"<meta name=\"keywords\" content=\"h1\">","2":"<meta name=\"keywords\" content=\"h2\">"},"footer_script":[""],"redirect_url":"","exit_message":""}');
        console.log(data);
Run Code Online (Sandbox Code Playgroud)

现在它告诉我错误是:

SyntaxError:JSON.parse:在JSON数据的第1行第766行的对象中的属性值之后的','或'}'

哪个会在'=':

"<meta name=\"keywords\" content=\"h1\">"
Run Code Online (Sandbox Code Playgroud)

有人有任何线索吗?我尝试了不同的解析器,我完全坚持了!

iso*_*cte 6

您需要\将String中的字符双重编码为\\.

var s = '{"page_name":"Test page","page_title":"Test title","site":"0","page_url":"http://saulius.epickitdev.com/test-page","page_type":"1","bg_type":"gradient","background_img_url":"","fill_bg_color":"","background_color":"","background_gradient_top":"5194c4","background_gradient_bottom":"000000","video_type":"yt","youtube_video_url":"","youtube_video_start_from":"","mp4_video_url":"","webm_video_url":"","ogg_video_url":"","width_type":"fixed","width_padding":"10","layout_color":"cc25cc","border_size":"3","border_color":"5a7de6","container_position":"middle","container_position_left":"","container_position_right":"","meta_title":"mtest","meta_description":"mdesc","meta_keyword":"mkey","fb_title":"ftitle","fb_description":"fdesc","header_script":{"1":"<meta name=\\"keywords\\" content=\\"h1\\">","2":"<meta name=\\"keywords\\" content=\\"h2\\">"},"footer_script":[""],"redirect_url":"","exit_message":""}'
$.parseJSON(s)
Run Code Online (Sandbox Code Playgroud)

这是因为它们在字符串内部的字符串中转义.

顶级字符串是整个值,因此解开一个级别的转义会导致这个,

{"1":"<meta name="keywords" content="h1">"} #Invalid JSON
Run Code Online (Sandbox Code Playgroud)

这是无效的,因为值中的引号不再被转义,因为顶级JavaScript字符串解包了它们.当JavaScript解释器读入该字符串文字时,所有\字符都被解包为一个级别,这意味着它\"变为公正".然后需要处理JSON字符串,但它不再有效,因为你想要转义的引号现在没有转义(实际上它们从未真正转义过,它们就是这样.)当你使用单引号时,你不需要逃避",但你总能逃脱任何事情,如果它不是一个特殊的角色,它什么也不做.

因此,为了在处理顶级字符串后仍然转义引号,您需要转义\自身.

var s = '{"1":"<meta name=\\"keywords\\" content=\\"h1\\">"}'
console.log(s) //'{"1":"<meta name=\"keywords\" content=\"h1\">"}'
$.parseJSON(s)
Run Code Online (Sandbox Code Playgroud)

  • 它完全转义为JSON,但你在JS中使用它作为字符串.如果你从文件或ajax中读取字符串,它会解析得很好.问题是你只是将它复制到你的JS文件中而没有正确的字符串转义. (2认同)