解析Json内部的函数

Parse function inside Json

本文关键字:函数 内部 Json 解析      更新时间:2023-09-26

我有这个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函数表达式。

因此,实现所需结果的步骤是:

  1. 将函数表达式字符串括在括号中(原因请参见脚注)
  2. 调用eval函数以计算函数声明表达式
  3. 将函数声明表达式分配给包含字符串值的同一属性

对于您给出的简单示例,您可以通过以下方式获得所需结果:

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);

请注意,我在你的代码上尝试过,但你发布的字符串有一些错误。请确保你的函数是正确的。