解析Json内部的函数
Parse function inside Json
我有这个JSON是函数JSON.stringify():的结果
{"get":"function (f,g){'use strict';var h,i;if(i={},'string'==typeof f){if('object'==typeof g)for(h in g)i[h]=g[h];i.url=f}else if('object'==typeof f)for(h in f)i[h]=f[h];return i.type=i.type||d,i.oauthio={provider:a,tokens:b,request:c},e.http(i)}","post":"function (f,g){'use strict';var h,i;if(i={},'string'==typeof f){if('object'==typeof g)for(h in g)i[h]=g[h];i.url=f}else if('object'==typeof f)for(h in f)i[h]=f[h];return i.type=i.type||d,i.oauthio={provider:a,tokens:b,request:c},e.http(i)}"}
如何查看值中的函数。我想重建这个JavaScript对象,我的目标是删除risult中的引号,但也删除值;因为在这种情况下,函数被识别为字符串。我想要这样的东西:{key : value}
现在我得到:{key : "value"}
快速答案:
下面的功能可以做到这一点:
function fix(obj){
for (var property in obj) {
if (obj.hasOwnProperty(property)) {
obj[property] = eval("(" + obj[property] + ")");
}
}
}
如果obj已经解析了JSON对象,那么只需执行以下操作:
fix(obj);
console.log(obj); // in case you want to see the change in the console
解释(如果需要):
如果在调用eval之前用括号"()"将字符串括起来,则可以获得javascript函数表达式。
因此,实现所需结果的步骤是:
- 将函数表达式字符串括在括号中(原因请参见脚注)
- 调用eval函数以计算函数声明表达式
- 将函数声明表达式分配给包含字符串值的同一属性
对于您给出的简单示例,您可以通过以下方式获得所需结果:
var obj = {"get":"function (f,g){'use strict';var h,i;if(i={},'string'==typeof f){if('object'==typeof g)for(h in g)i[h]=g
[h];i.url=f}else if('object'==typeof f)for(h in f)i[h]=f[h];return i.type=i.type||d,i.oauthio=
{provider:a,tokens:b,request:c},e.http(i)}","post":"function (f,g){'use strict';var h,i;if(i={},'string'==typeof f){if
('object'==typeof g)for(h in g)i[h]=g[h];i.url=f}else if('object'==typeof f)for(h in f)i[h]=f[h];return i.type=i.type||
d,i.oauthio={provider:a,tokens:b,request:c},e.http(i)}"};
obj.get = eval("(" + obj.get + ")");
obj.post = eval("(" + obj.post + ")");
您可以通过使用以下功能实现自动化:
function fix(obj){
for (var property in obj) {
if (obj.hasOwnProperty(property)) {
obj[property] = eval("(" + obj[property] + ")");
}
}
}
你的最终代码应该是这样的:
function fix(obj){
for (var property in obj) {
if (obj.hasOwnProperty(property)) {
obj[property] = eval("(" + obj[property] + ")");
}
}
}
var obj = {"get":"function (f,g){'use strict';var h,i;if(i={},'string'==typeof f){if('object'==typeof g)for(h in g)i[h]=g
[h];i.url=f}else if('object'==typeof f)for(h in f)i[h]=f[h];return i.type=i.type||d,i.oauthio=
{provider:a,tokens:b,request:c},e.http(i)}","post":"function (f,g){'use strict';var h,i;if(i={},'string'==typeof f){if
('object'==typeof g)for(h in g)i[h]=g[h];i.url=f}else if('object'==typeof f)for(h in f)i[h]=f[h];return i.type=i.type||
d,i.oauthio={provider:a,tokens:b,request:c},e.http(i)}"};
fix(obj);
脚注:
如果你有兴趣知道为什么需要括号,请查看下面的链接:
为什么JavaScript';s eval需要括号来评估JSON数据?
此解决方案比使用eval
:更好
假设obj
包含json,这意味着函数是obj.get
,但它是一个字符串,要将其转换为真正的函数,可以使用构造函数Function
obj.get = new Function(obj.get);
请注意,我在你的代码上尝试过,但你发布的字符串有一些错误。请确保你的函数是正确的。
相关文章:
- 调用函数内部的函数
- javascript函数内部的代码用逗号而不是分号分隔
- javascript无法重新定义函数内部的全局对象
- 如何从函数内部的这个变量中获取值
- appendChild在函数外部工作,但在函数内部不工作
- 在jquery函数内部设置来自jquery函数的var;t运行
- 一个'var'在函数内部声明
- 为什么(如何)'这'从函数内部调用回调时发生更改
- 函数内部未定义的输入值
- 在Meteor中如何将数据从函数内部复制到其他模板
- 如果在构造函数内部为else,则Javascript是可选的
- 我对“;返回true"嵌套函数内部;t工作
- jQuery 无法使用 AJAX 调用访问函数内部的函数参数
- javascript,将参数传递给函数内部的闭包中的回调
- 匿名自执行js函数内部的全局变量在外部仍然可用
- 使用PHP和Javascript在函数内部传递alphaneumeric值作为参数时出错
- 访问函数内部的Polymer方法
- 更改函数内部的全局变量而不调用它
- 如何在函数内部为jquery工具提示调用不同的var字符串
- 构造函数内部的事件处理