将对象字符串转换为JSON

时间:2012-01-27 16:11:38

标签: javascript json object

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

例如:转换它( NOT 一个有效的JSON字符串):

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

进入这个:

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

我希望尽可能避免使用eval()

21 个答案:

答案 0 :(得分:173)

如果该字符串来自受信任的来源,您可以使用eval,然后使用JSON.stringify结果。像这样:

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

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

我也同意这个问题下的评论,即在开始时用有效的JSON编码对象会更好,并且避免必须解析,编码,然后可能再次解析 。 HTML支持单引号属性(只需确保对字符串中的任何单引号进行HTML编码)。

答案 1 :(得分:108)

您的字符串无效JSON,因此JSON.parse(或jQuery' s $.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 d。首先,它们的键和值都需要用双引号引用。它应该看起来像(HTML中的单引号属性有效):

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

现在,您可以使用JSON.parse(或jQuery&#39; s $.parseJSON)。

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

答案 2 :(得分:49)

jQuery.parseJSON

str = jQuery.parseJSON(str)

编辑。如果您有一个有效的JSON字符串

,则可以使用此选项

答案 3 :(得分:39)

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

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);

答案 4 :(得分:22)

我希望这个小函数将无效的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…}

答案 5 :(得分:9)

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

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

致电:

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

答案 6 :(得分:4)

免责声明:请勿在家中尝试此操作,或者在需要其他开发人员认真对待您的任何事情时:

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

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

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

编辑:修复为Rocket建议。

答案 7 :(得分:4)

我把答案给那些对这个旧帖子感兴趣的人。

我为jQuery插件和HTML5 data-* parser创建了demo,它将格式错误的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"
}

答案 8 :(得分:2)

道格拉斯·克罗克福德有一个转换器,但是我不确定它会对糟糕的JSON有帮助。

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

答案 9 :(得分:2)

你需要使用&#34; eval&#34;然后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

答案 10 :(得分:1)

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

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

答案 11 :(得分:1)

有一种更简单的方法可以实现这一壮举,只需劫持虚拟元素的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(打开你的控制台)

答案 12 :(得分:1)

您最好和最安全的赌注是JSON5 – JSON for Humans。它是专门为该用例创建的。

&#13;
&#13;
properties
&#13;
assignin()
&#13;
&#13;
&#13;

答案 13 :(得分:0)

对于上面的简单示例,您可以使用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\"] }"

答案 14 :(得分:0)

只是因为它的怪癖,你可以通过babel-standalone

转换你的字符串

&#13;
&#13;
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))
&#13;
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
&#13;
&#13;
&#13;

答案 15 :(得分:0)

var str =&#34; {hello:&#39; world&#39;,places:[&#39; Africa&#39;,&#39; America&#39;,&#39; Asia&#39; ;,&#39;澳大利亚&#39;]}&#34; var fStr = str .replace(/([A-z] *)(:) / g,&#39;&#34; $ 1&#34;:&#39;) .replace(/&#39; / g,&#34; \&#34;&#34;)

的console.log(JSON.parse(FSTR))enter image description here

抱歉,我在手机上,这是一张照片。

答案 16 :(得分:0)

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

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

我认为这应该适用于多行和所有可能出现的(/ g标志)单引号&#39;字符串&#39;替换为双引号&#34;字符串&#34;。

答案 17 :(得分:0)

也许你必须尝试这个:

str = jQuery.parseJSON(str)

答案 18 :(得分:0)

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

答案 19 :(得分:0)

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

来源: MDN2ality

答案 20 :(得分:0)

这也将起作用

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