将对象字符串转换为 JSON

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

例如: 转换这个(没有是一个有效的 JSON 字符串) :

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

变成这样:

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

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

586664 次浏览

道格拉斯·克罗克福特有一个转换器,但我不确定它是否有助于将糟糕的 JSON 转换为好的 JSON。

Https://github.com/douglascrockford/json-js

ParseJSON

str = jQuery.parseJSON(str)

编辑。前提是您有一个有效的 JSON 字符串

谨慎使用(因为 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及以下版本)使用 Crocford 的 JSON 垫片

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

编辑: 按照 Rocket 的建议修改。

您的字符串不是有效的 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.parsed。首先,它们的键和值都需要用双引号引起来。它应该看起来像(HTML 中的单引号属性是有效的) :

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

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

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

如果字符串来自受信任的源 ,那么可以使用 eval然后使用 JSON.stringify得到结果:

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

请注意,当 eval是一个对象文字时,它必须用括号括起来,否则大括号将被解析为一个块而不是一个对象。

我也同意这个问题下面的注释: 最好是从有效的 JSON 开始编码对象,避免必须解析、编码,然后大概解析它 再来一次。HTML 支持单引号属性(只要确保在字符串中对任何单引号进行 HTML 编码)。

您必须编写圆括号,因为如果没有圆括号,eval将把花括号内的代码视为命令块。

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

我把我的答案放在一个对这个旧帖子感兴趣的人那里。

我为 jQuery 插件创建了 HTML5 data-* 解析器小样,它们不使用 eval()就可以将错误的 JSON 字符串转换成 JavaScript 对象。

它可以传递下面的 HTML5 data-* 属性:

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

进入物体:

{
hello: "world"
}

有一个更简单的方法来实现这个功能,只需劫持一个虚拟元素的 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(打开控制台)

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

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

结果

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 的好方法:

"{ 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 . place (/([ A-z ] *)(:)/g,’“ $1”:’) 。替换(/’/g,“”)

Log (JSON.parse (fStr))enter image description here

对不起,我在打电话,这里有一张照片。

只有一个正则表达式而不使用 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);

enter image description here

您最好和最安全的选择是 人类的 JSON5-JSON。它是专门为该用例创建的。

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>

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

使用 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 }

资料来源: MDN ,< a href = “ http://2ality.com/2014/01/eval.html”rel = “ nofollow noReferrer”> 2ality