代码之家  ›  专栏  ›  技术社区  ›  David Murdoch

php json_编码和javascript函数

  •  22
  • David Murdoch  · 技术社区  · 15 年前

    我需要用PHP将一个javascript函数编码成一个JSON对象。

    这是:

    $function = "function(){}";
    $message = "Hello";
    
    $json = array(   
          'message' => $message,
          'func' => $function
    );
    echo json_encode($json);
    

    输出:

    {"message":"Hello","func":"function(){}"}
    

    我想要的是:

    {"message":"Hello","func":function(){}}
    

    我可以用json_encode做这个吗?

    9 回复  |  直到 6 年前
        1
  •  22
  •   noun    8 年前

    正如Jani所说,这不可能直接通过JSON实现,但这可能有助于您: http://web.archive.org/web/20080828165256/http://solutoire.com/2008/06/12/sending-javascript-functions-over-json/

        2
  •  9
  •   Jani Hartikainen    15 年前

    不,JSON规范不支持函数。您可以编写自己的代码以类似于JSON的格式输出它,但它应该可以正常工作。

        3
  •  6
  •   Marvin Saldinger    8 年前

    如果不想编写自己的JSON编码器,可以求助于 Zend_Json ,Zend框架的JSON编码器。它包括应对 JSON expressions .

        4
  •  4
  •   mirmidon    9 年前

    JSON解码将给定的数组解析为JSON字符串,这样您就可以将其作为字符串来使用。只需使用一些唯一的字符串来指示函数的开始和结束。然后使用str_replace删除引号。

    $function = "#!!function(){}!!#"; 
    $message = "Hello";
    
    $json = array(   
      'message' => $message,
      'func' => $function
    );
    $string = json_encode($json);
    $string = str_replace('"#!!','',$string);
    $string = str_replace('!!#"','',$string);
    echo $string;
    

    输出将是:

    {"message":"Hello","func":function(){}}
    
        5
  •  0
  •   A1Gard gshock    7 年前

    我为所有基于JSON函数的帮助编写了这个简单的函数myabe帮助某人:

    function json_encode_ex($array) {
        $var = json_encode($array);
        preg_match_all('/\"function.*?\"/', $var, $matches);
        foreach ($matches[0] as $key => $value) {
            $newval = str_replace(array('\n', '\t','\/'), array(PHP_EOL,"\t",'/'), trim($value, '"'));
            $var = str_replace($value, $newval, $var);
        }
        return $var;
    }
    
        6
  •  0
  •   balping    6 年前

    我写了一篇 small library 这样就可以做到。它类似于Zend Framworks的解决方案,但是这个库更轻,因为它使用内置的 json_encode 功能。它也更容易与外部库一起使用,其中 詹森编码 深埋在供应商代码中。

    <?php
        use Balping\JsonRaw\Raw;
        use Balping\JsonRaw\Encoder;
    
        $array = [
            'type' => 'cat',
            'count' => 42,
            'callback' => new Raw('function(a){alert(a);}')
        ];
    ?>
    
    <script>
        let bar = <?php echo Encoder::encode($array); ?>
        bar.callback('hello'); //prints hello
    </script>
    
        7
  •  -1
  •   Adam    9 年前

    您可以尝试以下操作:

    var json_string = '{"message":"Hello","myfunc":"function(){ alert(this.message) }"}';
    var json_string = JSON.parse(json_string, function(k,v){
        if(typeof v == 'string' && /function\(\)\{/.test(v)){
            return eval(k+' = '+v); 
        }else{
            return v
        }
    });
    
        8
  •  -1
  •   Delcon    8 年前

    PHP中的编码部分现在似乎已经解决了。你可以使用

    json_encode($p, JSON_UNESCAPED_UNICODE)

    这样您的函数就不会被转义。然而

        9
  •  -2
  •   Vicky Jain    8 年前

    此功能还可以帮助:

    function jsonify($var){
    return str_ireplace(array("'function",'"function',"}'",'}"'),array("function",'function',"}",'}'),json_encode($var));
    }
    

    从这里取: http://network.convergenceservices.in/forum/105-uknowva-development/4710-introducing-convhelperjsonify-in-uknowva-251.html#4710