如何解析包含函数的 JSON 字符串
How can I parse a JSON string containing functions?
我有一个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+):
您可以使用 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)} }"
}
]`;
你得到的实际错误是因为你应该写var str = ...
而不是string
。
您可以获取包含该函数的子字符串,并使用 eval
将它们作为函数进行评估。但是,这可能会导致严重的安全问题和其他问题。引用道格拉斯·克罗克福德的话:
eval 函数(及其相关函数 Function、setTimeout 和 setInterval)提供对 JavaScript 编译器的访问。这有时是必要的,但在大多数情况下,它表明存在极其糟糕的编码。eval 函数是 JavaScript 中最容易被滥用的特性。
如果你真的想走这条路,你可以用eval
来做,但你已经被警告:)
顺便说一下,如果你已经解析了你的JSON,你可以这样做:
obj[0].getConnectorPosition = eval(obj[0].getConnectorPosition);
因此,您将以前的字符串替换为计算的方法。
下面是一个将包含函数的 json 字符串转换回具有有效函数声明的 json 对象的示例。
var jsonstring = "{'"schema'": {'"title'": '"User Feedback'", '"description'":'"so'", '"type'":'"object'", '"properties'":{'"name'":{'"type'":'"string'"}}}," + "'"options'":{ '"form'":{'"attributes'":{}, '"buttons'":{ '"submit'":{ '"title'":'"It'", '"click'":'"function(){alert('hello');}'" }}} }}";
var jsonData = JSON.parse(jsonstring);
function Iterate(data)
{
jQuery.each(data, function (index, value) {
if (typeof value == 'object') {
Iterate(value);
}
else {
if (value.indexOf("function()") > -1)
data[index] = eval("(" + value + ")");
}
});
};
Iterate(jsonData);
//call the embedded function
jsonData.options.form.buttons.submit.click();
- 如何使用JSON字符串中的jQuery填充下拉框
- Json字符串可以'当字符串末尾有“'时,t解码;
- jquery从2个json字符串构建一个复选框表单
- RegEx只匹配JSON字符串中最里面的数组
- json字符串的Javascript帖子:没有任何东西传入或返回
- 使用javascript在MVC视图中解析.net JSON字符串
- 用Angularjs+Typescript将GZip Json字符串解压为普通Json字符串
- 如何将表单数据传递给PHP并将json字符串返回给Javascript
- 如何使用AngularJS应用基于Json字符串响应的条件CSS类
- 停止JSON.parse()从JSON字符串数据中删除尾随零
- 将JSON字符串转换为函数参数
- 在AngularJS中创建JSON字符串
- 为什么我不能使用jQuery.parseJSON(json)解析json字符串
- Json字符串更改日期
- JSON字符串格式错误
- Json和$scope的角度之间的差异$eval应用于JSON字符串时
- C#JSON字符串到JavaScript数组
- 如何在JSON字符串中实现嵌套HTML
- 如何从带有多个对象的JSON字符串创建JSON对象
- 使用捕获组查找和替换json字符串中出现的所有短语