-1

JS 関数定義を含む JSON を変換する方法

{  
    "a1": "5",  
    "b1": "10",  
    "c1": "function(param1,param2) { return param1 +param2}"  
}

これらの関数を含む JavaScript オブジェクト (定義を含む文字列ではありません):

{  
    a1: 5,  
    b1: 10,  
    c1: function(param1,param2) { return param1 + param2}  
}
4

4 に答える 4

2

reviver 関数を に渡すことができますJSON.parse。これにより、解析された値にカスタム ロジックを適用できます。

この関数では、値がパターンで始まるかどうかをテストできますfunction(...) {

var obj = JSON.parse(str, function(k, v) {

    if (/^\s*function\s*\([^)]*\)\s*{/.test(v)) {
        try {
            // using the Function constructor to evaluate the function
            // definition in global scope
            return Function('return ' + v)();
        }
        catch() {
            return v; // maybe not a JS function definition after all
        }
    }
    return v;
});

デモ

もちろん、結果のオブジェクトを反復処理して、解析後に同じロジックを適用することもできますが、ネストされたオブジェクト/配列がある場合は、リバイバー関数を使用する方が簡単です。

これは非常に単純なテストであり、無名関数に対してのみ機能することに注意してください。関数に名前を付けた場合は、それに応じて式を調整する必要があります。しかし、これが基本的な考え方です。

于 2013-08-26T13:21:11.970 に答える
0

2 ステップ: json を解析し、関数のソース コードを関数にプロモートします。

var jsonObj = JSON.parse(jsonFromAjax);
jsonObj.c1 = eval(jsonObj.c1);
于 2013-08-26T13:16:56.827 に答える
0

JS 関数JSON.parseを使用する

var myobj = JSON.parse("{\"a1\": \"5\",  \"b1\": \"10\",  \"c1\": \"function(param1,param2) { return param1 +param2}\"  }");
于 2013-08-26T13:16:34.617 に答える
-1

関数を含む 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);

この場合、jsonData.options.form.buttons.submit.click();

于 2015-11-22T13:36:15.933 に答える