Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Json中的解析函数_Javascript_Json_Function - Fatal编程技术网

Javascript Json中的解析函数

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); 请注意

这个JSON是函数JSON.stringify()的结果:

如何看到值中有函数。我想重建这个JavaScript对象,我的目标是删除risult中的引号以及值;因为在本例中,函数被识别为字符串。我想要这样的东西:
{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函数表达式

因此,实现预期结果的步骤是:

  • 将函数表达式字符串括在括号中(原因请参见脚注)
  • 调用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);
    

    脚注:

    如果您有兴趣了解为什么需要括号,请查看以下链接:


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