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

标签 javascript jquery json

我有一个 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 对象,然后调用这些函数?

最佳答案

抛出错误是因为在 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+):

您可以使用 letconst 定义变量,声明为 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)} }"
  }
  ]`;

关于javascript - 如何解析包含函数的 JSON 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28140728/

相关文章:

jquery - 按顺序运行函数而不嵌套函数 - jQuery

javascript - 窗口事件上的 JQuery 函数 : combine load and resize

javascript - 通过 JSON 对象的路径获取值

javascript - 如何 'onclick' 5秒后关闭javascript?

javascript - 在滚动时创建一个粘性标题,位置固定会破坏标题

javascript - 根据单击的链接标题显示/隐藏元素?

javascript - 在单个函数中处理多个对象

java - 如何使用 jackson 反序列化带有索引的数组

javascript - 如何使用 jQuery 更改元素的名称和 id?

javascript - 将项目添加到列表顶部并向下滚动