Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将类似JSON(而非JSON)的字符串转换为对象?_Javascript_Json - Fatal编程技术网

Javascript 如何将类似JSON(而非JSON)的字符串转换为对象?

Javascript 如何将类似JSON(而非JSON)的字符串转换为对象?,javascript,json,Javascript,Json,我们都知道我们可以使用JSON.parse()将字符串'{a:0,b:“haha”}转换为对象{a:0,b:'haha'} 但是我们可以将字符串'{a:0,b:“haha”}转换为对象{a:0,b:'haha'} 我正在写一个网络爬虫,我需要获取页面中的数据。但完整的数据不在DOM中,而是在一个元素中。因此,我在中获得了有用的内容,并将该字符串(如'window.Gbanners=[{…},{…},{…},{…},{…},;”)转换为类似JSON的字符串(如'{banner:[…]})。但是,我

我们都知道我们可以使用
JSON.parse()
将字符串
'{a:0,b:“haha”}
转换为对象
{a:0,b:'haha'}

但是我们可以将字符串
'{a:0,b:“haha”}
转换为对象
{a:0,b:'haha'}


我正在写一个网络爬虫,我需要获取页面中的数据。但完整的数据不在DOM中,而是在一个
元素中。因此,我在
中获得了有用的内容,并将该字符串(如
'window.Gbanners=[{…},{…},{…},{…},{…},;”
)转换为类似JSON的字符串(如
'{banner:[…]}
)。但是,我无法解析“类似JSON”的字符串。有人有解决办法吗

{A:0,b:“haha”}
这样的字符串不是JSON,而是一堆JavaScript代码

获取内部数据的JSON表示的最佳方法是通过JS解析器(例如)运行它,遍历语法树并从中构建JSON对象。这需要一些工作,但至少您可以正确地完成解析,并正确地处理转义序列

这是一个起点:

const esprima = require("esprima");
const code = '({a: 0, b: "haha"})';
const ast = esprima.parse(code);

const properties = ast.body[0].expression.properties;
const output = properties.reduce((result, property) => { 
  result[property.key.name] = property.value.value;
  return result;
}, {});
console.log(output);
这段代码对输入代码的外观进行了大量假设——对于原型来说可能还可以,但仍然需要进行错误检查和处理嵌套对象

(更通用的方法可能涉及一个递归函数,该函数接受
ObjectExpression
,并返回等效的JSON。)


我还必须将您的输入用括号括起来,以便根据JS语法,它是一个表达式(而不是块语句)。

{a:0,b:“haha”}
这样的字符串不是JSON,只是一堆JavaScript代码

获取内部数据的JSON表示的最佳方法是通过JS解析器(例如)运行它,遍历语法树并从中构建JSON对象。这需要一些工作,但至少您可以正确地完成解析,并正确地处理转义序列

这是一个起点:

const esprima = require("esprima");
const code = '({a: 0, b: "haha"})';
const ast = esprima.parse(code);

const properties = ast.body[0].expression.properties;
const output = properties.reduce((result, property) => { 
  result[property.key.name] = property.value.value;
  return result;
}, {});
console.log(output);
这段代码对输入代码的外观进行了大量假设——对于原型来说可能还可以,但仍然需要进行错误检查和处理嵌套对象

(更通用的方法可能涉及一个递归函数,该函数接受
ObjectExpression
,并返回等效的JSON。)


我还必须将您的输入用括号括起来,以便根据JS语法,它是一个表达式(而不是块语句)。

类似的方法可能会奏效:

function evalJsString(str) {
    let a = null;
    try {
        eval('a = ' + str);
    } catch (err) {
        console.error(err);
    }
    if(typeof a === "object")
      return a;
    else
      return null;
}

evalJsString('({a: 0, b: "haha"})');

类似的方法可能会奏效:

function evalJsString(str) {
    let a = null;
    try {
        eval('a = ' + str);
    } catch (err) {
        console.error(err);
    }
    if(typeof a === "object")
      return a;
    else
      return null;
}

evalJsString('({a: 0, b: "haha"})');
由于eval()有安全缺陷,最好不要使用它。一种可能的方法是创建自己的解析器,将其转换为JSON字符串,然后应用JSON.parse()。像下面这样

function toJSONString(input) {
   const keyMatcher = '([^",{}\\s]+?)';
   const valMatcher = '(.,*)';
   const matcher = new RegExp(`${keyMatcher}\\s*:\\s*${valMatcher}`, 'g');
   const parser = (match, key, value) => `"${key}":${value}`
   return input.replace(matcher, parser);
}

JSON.parse(toJSONString('{a: 0, b: "haha"}'))
由于eval()有安全缺陷,最好不要使用它。一种可能的方法是创建自己的解析器,将其转换为JSON字符串,然后应用JSON.parse()。像下面这样

function toJSONString(input) {
   const keyMatcher = '([^",{}\\s]+?)';
   const valMatcher = '(.,*)';
   const matcher = new RegExp(`${keyMatcher}\\s*:\\s*${valMatcher}`, 'g');
   const parser = (match, key, value) => `"${key}":${value}`
   return input.replace(matcher, parser);
}

JSON.parse(toJSONString('{a: 0, b: "haha"}'))

我建议评估的数据是否可能重复?(简单地去掉第一个和最后一个
)我们应该信任
eval
?我们可以执行破坏者可能在互联网上找到的任意代码吗?@Kos不,我们不行。我检查了我爬网的脚本,发现它只做了
window.Gbanners=[]。然后我简单地处理了这个脚本字符串并对其进行了
eval
ed。也许我暂时没问题?-^ ^ ^-我建议
eval
的数据可能重复?(简单地去掉第一个和最后一个
)我们应该信任
eval
?我们可以执行破坏者可能在互联网上找到的任意代码吗?@Kos不,我们不行。我检查了我爬网的脚本,发现它只做了
window.Gbanners=[]。然后我简单地处理了这个脚本字符串并对其进行了
eval
ed。也许我暂时没问题吧?-谢谢!你是说我需要在
中运行脚本?你能更具体地告诉我吗?我使用的是node.js.No,您应该解析它,请不要在您的节点环境中从internet运行随机脚本:)添加示例代码以启动您谢谢!你是说我需要在
中运行脚本?你能更具体地告诉我吗?我使用的是node.js.No,你应该解析它,请不要在你的节点环境中从互联网上运行随机脚本:)添加示例代码让你开始当我计划在看到@kos的答案后尝试使用递归方式处理更复杂的字符串时,这个简单而酷的解决方案让我大吃一惊!在看到@kos的答案后,当我打算尝试使用递归方法来处理更复杂的字符串时,这个简单而酷的解决方案让我大吃一惊!