Javascript Json中的解析函数
这个JSON是函数JSON.stringify()的结果: 如何看到值中有函数。我想重建这个JavaScript对象,我的目标是删除risult中的引号以及值;因为在本例中,函数被识别为字符串。我想要这样的东西:Javascript Json中的解析函数,javascript,json,function,Javascript,Json,Function,这个JSON是函数JSON.stringify()的结果: 如何看到值中有函数。我想重建这个JavaScript对象,我的目标是删除risult中的引号以及值;因为在本例中,函数被识别为字符串。我想要这样的东西:{key:value} 现在我得到:{key:“value”}这个解决方案比使用eval更好: 假设obj包含json,这意味着函数是obj.get但它是一个sting,要将其转换为实际函数,可以使用构造函数函数 obj.get = new Function(obj.get); 请注意
{key:value}
现在我得到:
{key:“value”}
这个解决方案比使用eval
更好:
假设obj
包含json,这意味着函数是obj.get
但它是一个sting,要将其转换为实际函数,可以使用构造函数函数
obj.get = new Function(obj.get);
请注意,我在您的代码上尝试了它,但您发布的字符串有一些错误。确保您的功能正确。快速回答: 下面的函数将执行此操作:
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函数表达式
因此,实现预期结果的步骤是:
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);
脚注: 如果您有兴趣了解为什么需要括号,请查看以下链接:
使用
eval
或功能(经过一些预处理后)。您可以通过向JSON.parse
传递一个reviver函数来自动执行此操作,如中所述。我强烈建议不要将函数存储为数据。我已经尝试了两种方法,但都没有尝试<代码>评估
不起作用,因为值缺少函数名。eval(“(“+str+”)”)
您可能需要解释为什么它更好。而且这不仅仅适用于OP的代码。必须进行一些预处理。感谢您的帮助,如果我想将此代码放在“for”或“while”中,您的意思是您的对象将有许多函数吗?如果是这样的话,它是只有函数还是其他元素?如果我有一个长json文件,它的值是如果所有函数都是函数,我会首先“转换”对象中的所有函数,然后使用它。看看另一个答案,了解我需要什么。(不幸的是,该解决方案目前不起作用)。通过您的代码,我得到以下结果:{get:function(),post:function()}
我错在哪里?我将重点放在函数上,代码不起作用,因为函数包含未定义的变量,这些变量实际上是在函数外部定义的,解决方案?至少在您提供的示例中是有效的,如果您有其他不起作用的情况,请将它们发布在这里,以便我可以尝试帮助您。在您编写时声明变量obj,这段代码对我来说不起作用:for(obj中的var属性){if(obj.hasOwnProperty(property)){obj[property]=eval((“+obj[property]+“);}}``console.log(obj)代码>结果是:{get:function(),post:function()}
,试试看。function语句解释正确,并按预期分配给变量。现在,如果您的函数不包含有效代码,那么如果您尝试执行它,肯定会得到一个错误,在您的情况下,正在使用未定义的变量。修复该功能,它将工作。请参见以下简单示例:
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);