Javascript 将对象字符串转换为JSON

Javascript 将对象字符串转换为JSON,javascript,json,object,Javascript,Json,Object,如何使用JavaScript(或jQuery)将描述对象的字符串转换为JSON字符串 e、 g:转换此字符串(不是有效的JSON字符串): 为此: str='{“你好”:“世界”、“地方”:[“非洲”、“美洲”、“亚洲”、“澳大利亚”]} 如果可能的话,我希望避免使用eval()。道格拉斯·克罗克福德(Douglas Crockford)有一个转换器,但我不确定它是否有助于将坏的JSON转换成好的JSON 编辑。如果您有有效的JSON字符串,请谨慎使用(因为eval()): 称为: var

如何使用JavaScript(或jQuery)将描述对象的字符串转换为JSON字符串

e、 g:转换此字符串(不是有效的JSON字符串):

为此:

str='{“你好”:“世界”、“地方”:[“非洲”、“美洲”、“亚洲”、“澳大利亚”]}

如果可能的话,我希望避免使用
eval()

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

编辑。如果您有有效的JSON字符串,请谨慎使用(因为
eval()
):

称为:

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

免责声明:不要在家中尝试此功能,或用于任何需要其他开发人员认真对待您的事情:

JSON.stringify(eval('(' + str + ')'));
我做到了。
尽量不要这样做,因为评估对你不好。如上所述,对于较旧的浏览器(IE7及以下版本),使用Crockford的JSON垫片

此方法要求字符串是有效的javascript,它将被转换为javascript对象,然后可以序列化为JSON


编辑:如火箭建议的那样修复。

您的字符串不是有效的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
是如何生成的,它应该在生成之前固定在那里,而不是在生成之后

编辑:您(在评论中)说此字符串存储在数据属性中:

<div data-object="{hello:'world'}"></div>
现在,您可以使用
JSON.parse
(或者jQuery的
$.parseJSON


如果字符串来自受信任的源,则可以使用
eval
,然后使用
JSON.stringify
对结果进行处理。像这样:

var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
var json = JSON.stringify(eval("(" + str + ")"));
请注意,当您
eval
对象文字时,必须将其包装在括号中,否则大括号将被解析为块而不是对象


我也同意问题下的评论,即最好先用有效的JSON编码对象,避免解析、编码,然后再解析它。HTML支持单个引用的属性(只需确保HTML对字符串中的任何单个引号进行编码)。

您必须编写圆括号,因为没有它们<代码> EVA/COD>将把卷曲括号内的代码视为命令块。


我把我的答案给了对这条老线索感兴趣的人

我创建了for jQuery插件,它将格式错误的JSON字符串转换为JavaScript对象,而不使用
eval()

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

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

有一种更简单的方法来完成这一壮举,只需劫持虚拟元素的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 ;)

这里有一个演示:(打开您的控制台)

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

反过来

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+'"'})         
}
结果

let 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…}

对于上面的简单示例,可以使用2个简单的正则表达式替换:

var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
str.replace(/(\w+):/g, '"$1":').replace(/'/g, '"');
 => '{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }'
大警告:这种简单的方法假设对象没有包含
字符的字符串。例如,如果不使用
eval
,我想不出将以下对象字符串转换为JSON的好方法:

function strToJson(str) {
  eval("var x = " + str + ";");
  return JSON.stringify(x);
}
"{ hello: 'world', places: [\"America: The Progressive's Nightmare\"] }"

仅就其特殊之处而言,您可以通过
babel standalone

var str=“{你好:'世界',地点:['非洲','美洲','亚洲','澳大利亚'];
函数toJSON(){
返回{
参观者:{
标识符(路径){
path.node.name='“'+path.node.name+'”
},
StringLiteral(路径){
删除path.node.extra
}
}
}
}
registerPlugin('toJSON',toJSON);
var parsed=Babel.transform(“(“+str+”)”{
插件:['toJSON']
});
var json=parsed.code.slice(1,-2)
console.log(JSON.parse(JSON))
var str=“{您好:'世界',地点:['非洲','美洲','亚洲','澳大利亚]}” var fStr=str .替换(/([A-z]*)(:)/g,“$1”:” .replace(/“/g,\”)

log(JSON.parse(fStr))


对不起,我在手机上,这是一张图片。

一个带有一个正则表达式且不使用eval的解决方案:

str.replace(/([\s\S]*?)(')(.+?)(')([\s\S]*?)/g, "$1\"$3\"$5")

我认为这适用于多行,所有可能出现的单引号“string”替换为双引号“string”的情况(/g标志)。

也许您必须尝试以下方法:

str = jQuery.parseJSON(str)
您需要先使用“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);

您最好、最安全的选择是。它是专门为该用例创建的

constresult=JSON5.parse({hello:'world',places:['Africa','America','Asia','Australia']});
console.log(JSON.stringify(result));
使用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 }
资料来源: ,这也会起作用

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

是的,我看到的问题是如何将JSON字符串转换为objectIt应该是
JSON.stringify(eval('('+str+')));
,并不是说我宽恕
eval
,而是他的字符串不是有效的JSON,所以
JSON.parse
不起作用。对于匿名的投票人,我向你挑战提供一个更好的解决方案。除此之外,投票失败的理由也不错。@Rocket:你错了。
eval()
是唯一的解决方法。b)我提醒过OP。c)看看Matthew Crumley的答案,想一个更好的解释。(哦,还有d)陈述
eval()
在这种广义的形式下是不好的就是胡说八道。)@Rocket:啊,误解就在那里。对不起,我还以为否决票是你的呢。@kuboslav:很好,你测试过了吗?他正在做
eval(“var x=“+str+”;”)
这是完全有效的JS。你不需要做
var x=({a:12})
@kuboslav
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
str.replace(/(\w+):/g, '"$1":').replace(/'/g, '"');
 => '{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }'
"{ hello: 'world', places: [\"America: The Progressive's Nightmare\"] }"
str.replace(/([\s\S]*?)(')(.+?)(')([\s\S]*?)/g, "$1\"$3\"$5")
str = jQuery.parseJSON(str)
 var errorString= "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
 var jsonValidString = JSON.stringify(eval("(" + errorString+ ")"));
 var JSONObj=JSON.parse(jsonValidString);
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
var json = JSON.stringify(eval("(" + str + ")"));
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 }
let str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"
let json = JSON.stringify(eval("("+ str +")"));