如何解析包含函数的JSON字符串?

法布里佐·莫雷洛(Fabrizio Morello)

我有一个看起来像这样的JSON对象:

string str = '[
  {
    "name": "data-input1",
    "type": "Element [in]",
    "description": "data-input1",
    "getConnectorPosition": "function (element) { return {x: 0, y: Math.floor(element.rectangle.width / 2)} }"
  },
  {
    "name": "data-output1",
    "type": "Element [out] [array]",
    "description": "data-output1",
    "getConnectorPosition": "function (element) { return {x: Math.floor(element.rectangle.width), y: Math.floor(element.rectangle.height / 2)} }"
  }
  ]';

并且我想将此字符串解析为一个对象。

我收到此错误:

Uncaught TypeError: string is not a function

调用方法getConnectorPosition时。

阅读先前的问题,我已经了解到JSON中的函数并非完全“合法”,并且错误也表明了这一点。

究竟如何正确地解析一个包含函数(如上)的JSON对象,然后调用这些函数?

theonlygusti

因为在JavaScript中您没有将变量声明为某种类型,而是始终使用var关键字,所以引发了您的错误如果更改string str为,var str则当前错误将消失。

然后,由于JavaScript无法处理多行字符串,因此您需要确保您的字符串为单行或转义为换行符:

     var str = '[\
        { "name": "data-input1", \
         "type": "Element [in]", \

无论如何,可以说您str正确声明了,并且单行或转义换行符,就可以像平常一样解析它:

var obj = JSON.parse(str);

以字符串形式访问您的函数如下所示:

obj[0].getConnectorPosition;

要实际使用您的函数,您必须对其进行评估:

eval(obj[0].getConnectorPosition)

是相同的

function (element) { return { x: 0, y: Math.floor(element.rectangle.width / 2) } }

更新为更现代的一天(ES6 +):

您可以使用let定义变量const,声明的变量const以后不能更改,let因此首选,var因为它在范围上更安全。

您还可以使用模板字符串文字来多行字符串。

所以你可以这样写:

const str = `[
  {
    "name": "data-input1",
    "type": "Element [in]",
    "description": "data-input1",
    "getConnectorPosition": "function (element) { return {x: 0, y: Math.floor(element.rectangle.width / 2)} }"
  },
  {
    "name": "data-output1",
    "type": "Element [out] [array]",
    "description": "data-output1",
    "getConnectorPosition": "function (element) { return {x: Math.floor(element.rectangle.width), y: Math.floor(element.rectangle.height / 2)} }"
  }
  ]`;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章