将对象string转换为JSON

如何将描述对象的string转换为使用JavaScript(或jQuery)的JSONstring?

例如:转换此( 不是一个有效的JSONstring):

var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }" 

进入这个:

 str = '{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }' 

如果可能,我很乐意避免使用eval()

如果string来自可信来源 ,则可以使用eval然后使用JSON.stringify结果。 喜欢这个:

 var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"; var json = JSON.stringify(eval("(" + str + ")")); 

请注意,当您eval一个对象字面量时,它必须用括号括起来,否则大括号会被parsing为一个块而不是一个对象。

我也同意在这个问题下的意见,只要将对象以有效的JSON编码开始,避免必须parsing,编码,然后大概再次parsing它。 HTML支持单引号属性(只要确保对string内的任何单引号进行HTML编码)。

你的string是无效的JSON,所以JSON.parse (或jQuery的$.parseJSON )将无法正常工作。

一种方法是使用eval来“parsing”“无效的”JSON,然后将其“转换”为有效的JSON。

 var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }" str = JSON.stringify(eval('('+str+')')); 

我build议不要试图“修复”无效的JSON,而是首先从有效的JSON开始。 str是如何生成的,应该在生成之前修正,而不是在生成之后。

编辑 :你说(在评论中)这个string是存储在一个数据属性:

 <div data-object="{hello:'world'}"></div> 

我build议你在这里修复它,所以它可以只是JSON.parse d。 首先,它们的键和值都需要用双引号引起来。 它应该看起来像(HTML中的单引号属性是有效的):

 <div data-object='{"hello":"world"}'></div> 

现在,您可以使用JSON.parse (或jQuery的$.parseJSON )。

 var str = '{"hello":"world"}'; var obj = JSON.parse(str); 

jQuery.parseJSON

 str = jQuery.parseJSON(str) 

编辑。 这是提供你有一个有效的JSONstring

在下面的链接中使用简单的代码:

http://msdn.microsoft.com/es-es/library/ie/cc836466%28v=vs.94%29.aspx

 var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}'; var contact = JSON.parse(jsontext); 

并相反

 var str = JSON.stringify(arr); 

我希望这个小函数将无效的JSONstring转换为有效的string。

 function JSONize(str) { return str // wrap keys without quote with valid double quote .replace(/([\$\w]+)\s*:/g, function(_, $1){return '"'+$1+'":'}) // replacing single quote wrapped ones to double quote .replace(/'([^']+)'/g, function(_, $1){return '"'+$1+'"'}) } 

结果

 var invalidJSON = "{ hello: 'world',foo:1, bar : '2', foo1: 1, _bar : 2, $2: 3, 'xxx': 5, \"fuz\": 4, places: ['Africa', 'America', 'Asia', 'Australia'] }" JSON.parse(invalidJSON) //Result: Uncaught SyntaxError: Unexpected token h VM1058:2 JSON.parse(JSONize(invalidJSON)) //Result: Object {hello: "world", foo: 1, bar: "2", foo1: 1, _bar: 2…} 

谨慎使用(因为eval() ):

 function strToJson(str) { eval("var x = " + str + ";"); return JSON.stringify(x); } 

请拨打电话:

 var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"; alert( strToJson(str) ); 

免责声明:不要在家里尝试,或者任何需要其他开发者认真对待的事情:

 JSON.stringify(eval('(' + str + ')')); 

在那里,我做到了。
尽量不要这样做,eval对你来说是坏的。 如上所述,使用旧版浏览器的Crockford JSON填充(IE7及以下版本)

这种方法需要你的string是有效的JavaScript ,这将被转换为JavaScript对象,然后可以被序列化为JSON。

编辑:固定为火箭build议。

我把我的回答放在对这个老话题感兴趣的人。

我为jQuery插件和演示创build了HTML5数据parsing器 ,它将格式不正确的JSONstring转换为JavaScript对象,而不使用eval()

它可以传递以下HTML5数据属性:

 <div data-object='{"hello":"world"}'></div> <div data-object="{hello:'world'}"></div> <div data-object="hello:world"></div> 

进入对象:

 { hello: "world" } 

道格拉斯·克罗克福德(Douglas Crockford)有一个转换器,但是我不确定它能帮助把不好的JSON转换成好的JSON。

https://github.com/douglascrockford/JSON-js

你必须写圆括号,因为如果没有它们, eval会将大括号内的代码视为命令块。

 var i = eval("({ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] })"); 

有一个简单的方法来完成这个壮举,只是劫持一个哑元素的onclick属性来强制你的string作为一个JavaScript对象返回:

 var jsonify = (function(div){ return function(json){ div.setAttribute('onclick', 'this.__json__ = ' + json); div.click(); return div.__json__; } })(document.createElement('div')); // Let's say you had a string like '{ one: 1 }' (malformed, a key without quotes) // jsonify('{ one: 1 }') will output a good ol' JS object ;) 

这是一个演示: http : //codepen.io/csuwldcat/pen/dfzsu (打开你的控制台)