将对象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。
你必须写圆括号,因为如果没有它们, 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 (打开你的控制台)