将对象字符串转换为 JSON

IT技术 javascript json object
2021-01-31 01:40:58

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

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

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

进入这个:

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

eval()如果可能的话,我很想避免使用

6个回答

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

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

请注意,当您eval使用对象字面量时,它必须包含在括号中,否则大括号将被解析为块而不是对象。

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

使用 eval() 将执行 JS 代码。它很容易被滥用。
2021-03-22 01:40:58
@allenhwkim 这个想法是从无效的 JSON 转换为有效的 JSON,因此eval将字符串转换为 JavaScript 对象(只要字符串代表有效的 JavaScript,即使它不是有效的 JSON,它也可以工作)。然后JSON.stringify从对象转换回(有效的)JSON 字符串。eval如果字符串不是来自受信任的来源,则调用是危险的,因为它实际上可以运行任何 JavaScript,从而开启跨站点脚本攻击的可能性。
2021-03-23 01:40:58
这没有意义,如果字符串来自受信任的来源,为什么我们将其转换为有效的 json。
2021-03-28 01:40:58
在这种情况下,如果字符串被构造,eval 仍然会做坏事,例如,像这样: var str = "(function() {console.log(\"bad\")})()";
2021-04-02 01:40:58
@allenhwkim:我们从不相信任何来源。对 IT 的信任意味着检查、检查和再检查。
2021-04-07 01:40:58

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

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

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

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

jQuery.parseJSON

str = jQuery.parseJSON(str)

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

是的,我看到了如何将 JSON 字符串转换为对象的问题
2021-04-08 01:40:58

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

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);
正如@LouiseMcMahon 所说,JSON.parse() 应该是这里接受的答案
2021-03-13 01:40:58
为了类型安全,通过 new String(jsontext) 将 jsontext 转换为 String 对象可能更好。
2021-03-21 01:40:58
@fuzzyanalysis:不,永远不应该使用原始包装器。
2021-03-24 01:40:58

我希望这个小函数将无效的 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…}
我们正在尝试使用 JSON.parse 我们的代码对 b 进行反评估,这看起来是一个很好的解决方案。我们仍然必须手动处理不断的替换,但至少这允许包含这些情况。
2021-03-15 01:40:58
这几乎是完美的。: 处于其中一个值时不起作用
2021-03-16 01:40:58
绝对的天才
2021-03-21 01:40:58
eval 是纯粹的邪恶,我认为这是要走的路
2021-04-12 01:40:58