2013-07-02 5 views
6

मैं PHP के json_encode() कुछ डेटा, jQuery के ajax() द्वारा प्राप्त वापस जाने के लिए उपयोग कर रहा हूँjson_encode एक विकृत JSON (अतिरिक्त छिपा चरित्र के साथ) बनाने

$.ajax({ 
    dataType: 'json', 
    contentType: 'application/json', 
    cache: false, 
    type: 'POST', 
    url: './api/_imgdown.php', 
    error: function(jqXHR, textStatus, errorThrow) { 
     console.log(jqXHR, textStatus, errorThrow); 
    }, 
    success: function(data, textStatus, jqXHR) { 
     console.log(data, textStatus, jqXHR); 
    } 
}); 

पीएचपी है:

:
header('Content-Type: application/json; charset=UTF-8'); 
//default apiResponse 
$apiResponse = [ 
    "status" => 1, 
    "message" => "success", 
    "data" => null 
]; 

फिर जब php मेरी कोड चलने पर वह इस डेटा जोड़कर समाप्त होता है

$apiResponse['data'][] = [ 
    "mid" => (int)$mid, 
    "card_type" => $card_type, 
    "header_size" => (int)$headers['Content-Length'], 
    "saved_size" => (int)filesize($imgSavePath), 
    "saved_path" => $imgSavePath 
]; 
//spit out the JSON 
echo json_encode($apiResponse); 
exit(); 

JSON:

{"status":1,"message":"success","data":[{"mid":340052,"card_type":"kakusei","header_size":48337,"saved_size":48337,"saved_path":"..\/card\/kakusei\/340052.png"}]} 

पहले यह वैध है। मेरा अजाक्स जो इस PHP को पुनर्प्राप्त करता है हमेशा parseerror (ajax() के भाग में) के साथ समाप्त होता है।

यदि आप इस JSON को http://jsonlint.com/ पर कॉपी और पेस्ट करते हैं, तो यह कहता है कि "अप्रत्याशित टोकन" और http://jsonformatter.curiousconcept.com/ कहता है मान्य नहीं है।

मैंने echo json_encode($apiResponse, JSON_UNESCAPED_SLASHES); की कोशिश की है, भले ही स्लेश से बचने से ठीक है \/ लेकिन कोई फर्क नहीं पड़ता।

लेकिन वास्तव में क्या मान्य नहीं है? PHP को वैध JSON वापस नहीं करना चाहिए था?

अतिरिक्त जानकारी:


अद्यतन: JSONlint में एसओ से

प्रतिलिपि बनाई जा रही मान्य JSON देता है। तो मैंने थोड़ा आगे की जांच की और देखा कि PHP एक अजीब छिपे हुए चरित्र का निर्माण कर रहा है जो वास्तव में जेसन को अमान्य बना रहा है। नीचे स्क्रीनशॉट देखें। मैं इसे कैसे ठीक करता हूं? json invalid character

+0

JSONLint इसे अच्छा दिखाता है। –

+0

आपका जेसन मान्य है, और आपका PHP मान्य है। मेरा अनुमान है कि यह आपका अजाक्स कॉल है। Json – sircapsalot

+0

का अनुरोध करने के लिए '$ .getJSON' एक सरल AJAX कॉल का उपयोग करने का प्रयास करें, यह जेसनलिंट पर मान्य है। –

उत्तर

8

यह बीओएम चिह्न के साथ एक मुद्दा हो सकता है। फ़ाइल को सामान्य यूटीएफ -8 के रूप में सहेजने का प्रयास करें।

+1

हाँ, जैसा कि आपने पता लगाने में मदद की, बीओएम चार '65279' था। मुझे इस मुद्दे के साथ एक और सवाल मिला है http://stackoverflow.com/questions/6538203/how-to-avoid-echoing-character-65279-in-php-this-question-also-relates-to-java समस्या क्या मुझे बीओएम की आवश्यकता है क्योंकि 'card_type' में' áéã' जैसे लैटिन वर्ण हो सकते हैं जो एचटीएमएल इकाइयों में एन्कोड नहीं किए जाते हैं, इस प्रकार 'बीओएम' के बिना सहेजे जाने पर बगिंग करते हैं। मैं सामान्य यूटीएफ -8 के रूप में सहेजूंगा और इसके लिए 'htmlentities()' का उपयोग करने की कोशिश करता हूं और काम करने की आशा करता हूं। आपके समय के जवाब के लिए धन्यवाद! – RaphaelDDL

+3

ओह मेरे भगवान। दो दिनों के लिए इस मुद्दे के लिए उत्तर खोजा है ... धन्यवाद! :-) –

-1

मुझे एक ही समस्या का सामना करना पड़ा है, लेकिन मुझे नहीं पता कि मेरे विंडोज़ पर कौन सी फाइल बीओएम के साथ यूटीएफ 8 में सहेजी गई है (भले ही मैंने जितनी फाइलें खोज सकें)।

हालांकि, मुझे कामकाज पता चला है। सर्वर साइड पर मान लिया जाये कि मैं $ पर

die(json_encode(array(
    'OK' => 1 
))) 
  1. है।ajax कॉल, मैं प्रवेश "डेटाप्रकार: 'json'" को हटा दें और मैं निम्नलिखित लाइनों के साथ प्रतिक्रिया के लिए पहुँच:
success: function (response) { 
     var data = $.parseJSON(response); 
     console.log(data.OK); // = 1 
    } 
  1. $ पर .ajax कॉल, मैं अभी भी प्रविष्टि "डेटाप्रकार: 'json'" रखने के लिए, तो मैं इस

वर dataOK = प्रतिक्रिया [ 'ठीक है'] की तरह प्रतिक्रिया के अंदर मूल्य तक पहुँचने के लिए है, // = 1

संबंधित मुद्दे