将没有引号的JSON字符串解析成JSON。

5

以下json字符串无法转换为json,因为键名没有用引号括起来。

{file:"http://video.test.com/media/myvideo.mp4", image:"/category/dt/filename.png", width:"100%", height:"100%", stretching:"uniform", autostart:true, modes:[{type:"flash", src:"/swf/external/player.swf"}, {type:"html5"}]}

我尝试过:

  1. JSON.parse --- 由于键不在引号内,无法解析。

  2. eval('('+str+')') --- 不知道为什么无法转换,同时也因为安全原因有些犹豫采用此解决方案。

  3. 手动插入双引号来分隔冒号(:),但我的一个值(即一个URL)中也有一个冒号,如下解决方案所示:正则表达式在JavaScript中添加双引号来包装值和键

为什么很难将这个字符串转换成json,怎样才能转换它?

var s = '{file:"http://video.test.com/media/myvideo.mp4", image:"/category/dt/filename.png", width:"100%", height:"100%", stretching:"uniform", autostart:true, modes:[{type:"flash", src:"/swf/external/player.swf"}, {type:"html5"}]}';

console.log(eval('(' + s + ')'));


你从哪里获取字符串的?我会从那里开始,尝试获取正确的JSON。 - Roland Starke
1
var result = eval('('+str+')') 应该可以正常工作。 - Jaromanda X
我正在从受信任的第三方提供的HTML文件中提取此字符串,他们无法立即支持发送JSON。 - Alagesan Palani
你能把你写的代码放上来吗?这样我们就可以了解出了什么问题了。 - Ghasan غسان
你说 [...]他们无法立即支持发送json[...],但这是否意味着你对他们如何格式化该字符串没有任何影响?因为最简单的方法是让他们将该字符串以正确的JSON格式存储在HTML文档中。 - t.niese
1个回答

11

主要问题是您从哪里获取了该字符串,但无论如何,以下是解决方案。

var obj = eval('(' + str + ')');
var json = JSON.stringify(obj);

1
或者简单地说,var obj = eval('(' + str + ')'); - Jaromanda X
@JaromandaX 我也这么想,但是因为它没有起作用,所以我相信了OP的话。 - Ghasan غسان
但是...也许OP没有var obj = :p - Jaromanda X
是的,它没有起作用,并且显示“str”未定义,即使它在其上面声明了,顺便说一下,我正在使用ES6和babel编写reactjs代码。我不确定这是否会阻止此编码风格。 - Alagesan Palani
@ParagJadhav 不,你不能使用RegExp可靠地解析作为字符串或JSON给出的JavaScript对象。如果字符串因某些原因发生更改并且包含一些意外的内容,则RegExp可能会失败。 - t.niese
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接