2009-11-16 57 views
20

Tôi cần mã hóa một hàm javascript thành đối tượng JSON trong PHP.Các hàm json_encode và javascript của PHP

này:

$function = "function(){}"; 
$message = "Hello"; 

$json = array( 
     'message' => $message, 
     'func' => $function 
); 
echo json_encode($json); 

kết quả đầu ra:

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

Những gì tôi muốn là:

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

Tôi có thể làm điều này với json_encode?

Trả lời

20

Như Jani cho biết, điều này không thể thực hiện trực tiếp với JSON, nhưng điều này có thể giúp bạn: http://web.archive.org/web/20080828165256/http://solutoire.com/2008/06/12/sending-javascript-functions-over-json/

+1

đó làm việc, mặc dù nó không thực sự JSON nữa. –

+0

Đối tượng JavaScript/Jscript/ECMAScript hợp lệ, đúng không? –

+0

Có, miễn là bạn phân tích cú pháp bằng 'eval' thay vì sử dụng trình phân tích cú pháp JSON nghiêm ngặt. –

9

Không. Thông số JSON không hỗ trợ chức năng. Bạn có thể viết mã của riêng bạn để xuất nó theo định dạng giống như JSON và nó sẽ hoạt động tốt.

6

Nếu không muốn viết encoder JSON riêng của bạn, bạn có thể dùng đến Zend_Json, bộ mã hóa JSON cho Zend Khung. Nó bao gồm khả năng đối phó với JSON expressions.

+1

Chúa ơi, điều này thật tuyệt vời. –

-1

Bạn có thể thử này:

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

json_decode phân tích các mảng cho chuỗi json, vì vậy bạn có thể chơi với nó như một chuỗi. Chỉ cần sử dụng một số chuỗi duy nhất để cho biết bắt đầu và kết thúc của hàm. Sau đó sử dụng str_replace để loại bỏ các dấu ngoặc kép.

$function = "#!!function(){}!!#"; 
$message = "Hello"; 

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

Kết quả sẽ là:

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

Một biến thể nhỏ để có thể sử dụng các ký tự: preg_match_all ('/ \ # ([^ \ #] *) \ # /', json_encode ($ json), $ unescape); foreach ($ unescape ['0'] là $ key => $ fn) { $ string = str_replace ($ fn, json_decode ($ unescape ['0'] [$ key]), $ string); } – Allartk

-1

Phần enconding trong PHP là có vẻ là được giải quyết ngay bây giờ. Bạn có thể sử dụng

json_encode($p, JSON_UNESCAPED_UNICODE)

cách này chức năng của bạn sẽ không được thoát. Tuy nhiên

+0

Tôi không nghĩ rằng điều này làm [những gì bạn nghĩ rằng nó] (http://php.net/manual/en/json.constants.php#constant.json-unescaped-unicode).Điều này là để không thoát khỏi các ký tự unicode mà không có gì để làm với các chức năng. – cpburnz

0

tôi viết chức năng này đơn giản cho tất cả các chức năng json dựa giúp đỡ của tôi myabe giúp đỡ ai đó:

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; 
} 
Các vấn đề liên quan