如何使用JavaScript(或jQuery)将描述对象的字符串转换为JSON字符串?
例如:转换这个(不是有效的JSON字符串):
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"
到这个:
str = '{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }'
eval()
如果可能,我希望避免使用。
如果字符串是来自可靠来源,你可以使用eval
然后JSON.stringify
的结果。像这样:
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
var json = JSON.stringify(eval("(" + str + ")"));
请注意,当您eval
使用对象文字时,必须将其括在圆括号中,否则将花括号解析为块而不是对象。
我也同意以下问题的评论:最好以有效的JSON开始编码对象,而不必先解析,编码,然后大概再次解析它,这会更好。HTML支持单引号属性(只需确保对字符串内的任何单引号进行HTML编码)。
您的字符串不是有效的JSON,因此JSON.parse
(或jQuery的$.parseJSON
)无效。
一种方法是使用eval
“解析”“无效” JSON,然后stringify
将其“转换”为有效JSON。
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"
str = JSON.stringify(eval('('+str+')'));
我建议不要尝试“修复”无效的JSON,而应该首先使用有效的JSON。如何str
生成,应该在生成之前固定在那里,而不是之后。
编辑:您说过(在注释中)此字符串存储在data属性中:
<div data-object="{hello:'world'}"></div>
我建议您在这里修复它,这样就可以了JSON.parse
。首先,它们的键和值都需要用双引号引起来。看起来应该像(HTML中的单引号属性有效):
<div data-object='{"hello":"world"}'></div>
现在,您可以使用JSON.parse
(或jQuery的$.parseJSON
)。
var str = '{"hello":"world"}';
var obj = JSON.parse(str);
str = jQuery.parseJSON(str)
编辑。前提是您拥有有效的JSON字符串
在下面的链接中使用简单的代码:
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);
我希望这个小功能可以将无效的JSON字符串转换为有效的JSON字符串。
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对您来说很糟糕。如上所述,对于较旧的浏览器(IE7及更低版本)使用Crockford的JSON填充程序
此方法要求您的字符串是有效的javascript,它将被转换为javascript对象,然后可以序列化为JSON。
编辑:固定火箭建议。
我将答案提交给对此旧主题感兴趣的人。
我为jQuery插件和演示创建了HTML5 data- *解析器,无需使用即可将格式错误的JSON字符串转换为JavaScript对象。eval()
它可以在下面传递HTML5 data- *属性:
<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
有一种更简单的方法可以完成此任务,只需劫持虚拟元素的onclick属性即可强制将字符串作为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(打开控制台)
您需要使用“ eval”,然后使用JSON.stringify,然后使用JSON.parse作为结果。
var errorString= "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
var jsonValidString = JSON.stringify(eval("(" + errorString+ ")"));
var JSONObj=JSON.parse(jsonValidString);
您必须编写圆括号,因为没有它们,eval
会将括号内的代码视为命令块。
var i = eval("({ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] })");
最好和最安全的选择是JSON5-JSON for Humans。它是专门为该用例创建的。
const result = JSON5.parse("{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }");
console.log(JSON.stringify(result));
<script src="https://cdnjs.cloudflare.com/ajax/libs/json5/0.5.1/json5.min.js"></script>
使用new Function()比使用eval更好,但仍应仅与安全输入一起使用。
const parseJSON = obj => Function('"use strict";return (' + obj + ')')();
console.log(parseJSON("{a:(4-1), b:function(){}, c:new Date()}"))
// outputs: Object { a: 3, b: b(), c: Date 2019-06-05T09:55:11.777Z }
对于上面的简单示例,您可以使用2个简单的正则表达式替换来实现:
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
str.replace(/(\w+):/g, '"$1":').replace(/'/g, '"');
=> '{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }'
大警告:这种幼稚的方法假定对象没有包含'
或:
字符的字符串。例如,如果不使用以下方法,我想不出一种将以下对象字符串转换为JSON的好方法eval
:
"{ hello: 'world', places: [\"America: The Progressive's Nightmare\"] }"
只是出于怪癖,您可以通过以下方式转换您的字符串 babel-standalone
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
function toJSON() {
return {
visitor: {
Identifier(path) {
path.node.name = '"' + path.node.name + '"'
},
StringLiteral(path) {
delete path.node.extra
}
}
}
}
Babel.registerPlugin('toJSON', toJSON);
var parsed = Babel.transform('(' + str + ')', {
plugins: ['toJSON']
});
var json = parsed.code.slice(1, -2)
console.log(JSON.parse(json))
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
var str =“ {hello:'world',place:['Africa','America','Asia','Australia']}” var fStr = str .replace(/([[Az] *)(:)/ g,'“ $ 1”:').replace(/'/ g,“ \”“)
console.log(JSON.parse(fStr))
抱歉,我在电话上,这是一张照片。
使用一个正则表达式而不使用eval的解决方案:
str.replace(/([\s\S]*?)(')(.+?)(')([\s\S]*?)/g, "$1\"$3\"$5")
我认为这应该适用于多行,并且所有可能出现的单引号'string'都被替换为双引号“ string”(/ g标志)。
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
var json = JSON.stringify(eval("(" + str + ")"));
也许您必须尝试以下方法:
str = jQuery.parseJSON(str)
文章标签:javascript , json , object
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!
评论已关闭!