2009-11-16 14 views
20

मुझे PHP में किसी JSON ऑब्जेक्ट में जावास्क्रिप्ट फ़ंक्शन को एन्कोड करने की आवश्यकता है।PHP json_encode और जावास्क्रिप्ट फ़ंक्शंस

यह:

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

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

आउटपुट:

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

क्या मैं चाहता हूँ है:

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

मैं json_encode के साथ ऐसा कर सकते हैं?

उत्तर

20

के रूप में जानी ने कहा, यह संभव नहीं सीधे JSON के साथ है, लेकिन इस आप मदद कर सकता है: http://web.archive.org/web/20080828165256/http://solutoire.com/2008/06/12/sending-javascript-functions-over-json/

+1

काम करता है यही कारण है कि, हालांकि यह वास्तव में JSON नहीं रह गया है। –

+0

यह एक वैध जावास्क्रिप्ट/जेस्क्रिप्ट/ईसीएमएस्क्रिप्ट ऑब्जेक्ट है, है ना? –

+0

हां, जब तक आप सख्त JSON पार्सर का उपयोग करने के बजाय इसे 'eval' के साथ पार्स करते हैं। –

9

नहीं जेएसओएन स्पेक कार्यों का समर्थन नहीं करता है। आप जेएसओएन-जैसी प्रारूप में इसे आउटपुट करने के लिए अपना कोड लिख सकते हैं और इसे ठीक काम करना चाहिए।

6

यदि आप Zend के लिए, Zend_Json का सहारा कर सकते हैं JSON एनकोडर अपनी खुद की JSON एनकोडर लिखने के लिए नहीं करना चाहते हैं फ्रेमवर्क। इसमें JSON expressions से निपटने की क्षमता शामिल है।

+1

अच्छा भगवान, यह कमाल है। –

-1

आप इस कोशिश कर सकते हैं:

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 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(){}} 
+0

वर्णों का उपयोग करने में सक्षम होने के लिए एक छोटा संस्करण: preg_match_all ('/ \ # ([^ \ #] *) \ # /', json_encode ($ json), $ unescape); foreach ($ unescape ['0'] $ key => $ fn के रूप में) { $ string = str_replace ($ fn, json_decode ($ unescape ['0'] [$ key]), $ string); } – Allartk

-1

PHP में enconding हिस्सा प्रतीत हो रहा है है अब तक हल आप

json_encode($p, JSON_UNESCAPED_UNICODE)

इस तरह से अपने कार्य का उपयोग नहीं किया जाएगा उपयोग कर सकते हैं। हालांकि

+0

मुझे नहीं लगता कि यह ऐसा करता है [जो आपको लगता है] [http://php.net/manual/en/json.constants.php#constant.json-unescaped-unicode)।यह यूनिकोड वर्णों से बचने के लिए नहीं है जिनके कार्यों के साथ कुछ लेना देना नहीं है। – cpburnz

0

मैं सभी 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; 
} 
संबंधित मुद्दे