将对象字符串转换为JSON

sno*_*pey 159 javascript json object

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

例如:转换它(不是有效的JSON字符串):

var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"
Run Code Online (Sandbox Code Playgroud)

进入这个:

str = '{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }'
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*ley 177

如果字符串是来自可靠来源,你可以使用eval然后JSON.stringify的结果.像这样:

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

请注意,当您eval使用对象文字时,必须将其括在括号中,否则将大括号解析为块而不是对象.

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

  • @allenhwkim想法是从无效的JSON转换为有效的JSON,因此`eval`将字符串转换为JavaScript对象(只要字符串代表有效的JavaScript,即使它不是有效的JSON,它也可以工作).然后`JSON.stringify`从一个对象转换回一个(有效的)JSON字符串.如果字符串不是来自可靠来源,则调用`eval`是危险的,因为它可以真正运行任何JavaScript,从而开启了跨站点脚本攻击的可能性. (2认同)
  • 如果构造了字符串,eval在这种情况下仍会做坏事,例如,如下所示:var str ="(function(){console.log(\"bad \")})()"; (2认同)

Roc*_*mat 110

你的字符串是无效的JSON,所以JSON.parse(或jQuery的$.parseJSON)将无法正常工作.

一种方法是使用eval"解析""无效"JSON,然后stringify将其"转换"为有效的JSON.

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

我建议您不要试图"修复"无效的JSON,而是先从有效的JSON开始.如何str生成,它应该在生成之前修复,而不是之后.

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

<div data-object="{hello:'world'}"></div>
Run Code Online (Sandbox Code Playgroud)

我建议你在这里解决它,所以它可以只是JSON.parsed.首先,它们的键和值都需要用双引号引用.它应该看起来像(HTML中的单引号属性是有效的):

<div data-object='{"hello":"world"}'></div>
Run Code Online (Sandbox Code Playgroud)

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

var str = '{"hello":"world"}';
var obj = JSON.parse(str);
Run Code Online (Sandbox Code Playgroud)


Far*_*mor 49

jQuery.parseJSON

str = jQuery.parseJSON(str)
Run Code Online (Sandbox Code Playgroud)

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

  • 不正确,parseJSON**需要**有效的JSON (6认同)

Ron*_*ite 41

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

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);
Run Code Online (Sandbox Code Playgroud)

并反转

var str = JSON.stringify(arr);
Run Code Online (Sandbox Code Playgroud)

  • 这需要做出公认的答案. (4认同)

all*_*kim 23

我希望这个小函数将无效的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+'"'})         
}
Run Code Online (Sandbox Code Playgroud)

结果

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…}
Run Code Online (Sandbox Code Playgroud)


Tom*_*lak 9

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

function strToJson(str) {
  eval("var x = " + str + ";");
  return JSON.stringify(x);
}
Run Code Online (Sandbox Code Playgroud)

呼叫:

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

  • 给匿名的选民.我挑战你提供更好的解决方案.除此之外,投票的原因很好. (3认同)
  • @Rocket:啊,误解就在那里.对不起,我认为投票是你的.:) (2认同)
  • @kuboslav它在IE7中不起作用,因为IE7没有本机JSON支持.一旦你使用[`json2.js`](https://github.com/douglascrockford/JSON-js/blob/master/json2.js)它就会开始工作.不要那么引发快乐. (2认同)