尝试将一个 JavaScript 对象转换为字符串

3

我正在尝试使用一个非常奇怪的API,调用返回一个javascript eval代码的响应,该代码包含我以以下方式削减的javascript对象:

var obj = resp.substring(0, resp.length-9);

因此,获取对象的方式如下:

"{name: "Jon", code: 123, info: [{blah blah}, {blah blah}]}"

这个"对象"被识别为字符串,我无法提取它。

由于不是JSON格式,因此无法进行JSON解析。

使用new Object(obj)也不行,输出的对象已经被每个字符削减了。

有什么建议吗?

编辑:1 将每个 <"> 替换为 <'> 并不能解决问题。 进一步对结果进行JSON解析会在位置1打印出一个带有意外标记n的错误。

继续尝试新的方法。


使用 obj = eval(obj) - ponury-kostek
1
是的,这不是JSON。除了使用“eval”之外,实际上没有其他方法。 - Sebastian Simon
3
如有可能,最好避免在 API 返回的数据上使用 eval,因为这可能会让你容易受到代码注入攻击。 - Expired Data
你可以编写自己的“解析”函数,这样可以避免使用不够安全的 eval 函数。 - York Chen
我建议将那个“对象”转换为json,然后使用parse。毕竟这与json并没有太大的区别。 - Isac
2个回答

1
Eval函数在您的代码中会引起许多严重的安全问题。相反,您可以做的是,既然您有一个字符串,只需在字符串内将每个双引号(")替换为单引号,然后解析它。
JSON.parse仅在JavaScript解析器未获取到完美的对象级别字符串时才会失败。
代码:
var objStr = "{name: "Jon", code: 123, info: [{blah blah}, {blah blah}]}";
var obj = JSON.parse(objStr.replace(/"/g, "'"));

1

当从外部来源获取数据时,使用eval应该非常谨慎。

我建议尝试修复字符串以成为适当的正则表达式,而不是调用eval。一种方法是创建一个正则表达式,它将匹配属性名称并将其括在引号中:

let a = `{name: "Jon", code: 123, info: [{}, {}]}`;
let obj = JSON.parse(a.replace(/(\w|\d)+(?=\:)/g, "\"$&\""));

console.log(obj)

显然,如果您期望在对象的属性值中看到冒号,那么这个例子需要改进。

顺便说一句,没有理由使用反引号 :D - Matías Fidemraizer
1
我想,应该再加一个try {} catch (e) {}来包装JSON.parse()以处理异常情况,如果没有字符串化的对象。因为这是来自外部来源的数据 :) - Limbo
1
@MatíasFidemraizer 是的,那只是因为Jon周围有引号,我喜欢使用反引号。 - Expired Data
是的,过期数据。而且我所使用的编程语言使用双引号和单引号。 - Jalu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接