วิธีที่ฉันชอบใช้คือ pad / wrap json ด้วยอ็อบเจกต์ตามตัวอักษรจากนั้นบันทึกไฟล์ด้วยนามสกุลไฟล์. jsonp วิธีนี้ยังทำให้ไฟล์ json ดั้งเดิมของคุณ (test.json) ไม่เปลี่ยนแปลงเนื่องจากคุณจะทำงานกับไฟล์ jsonp ใหม่ (test.jsonp) แทน ชื่อบน wrapper สามารถเป็นอะไรก็ได้ แต่ไม่จำเป็นต้องเป็นชื่อเดียวกับฟังก์ชั่นการโทรกลับที่คุณใช้ในการประมวลผล jsonp ฉันจะใช้ test.json ของคุณที่โพสต์เป็นตัวอย่างเพื่อแสดงการเพิ่ม jsonp wrapper สำหรับไฟล์ 'test.jsonp'
json_callback({"a" : "b", "c" : "d"});
จากนั้นสร้างตัวแปรที่นำมาใช้ซ้ำได้ด้วยขอบเขตโกลบอลในสคริปต์ของคุณเพื่อเก็บ JSON ที่ส่งคืน สิ่งนี้จะทำให้ข้อมูล JSON ที่ส่งคืนพร้อมใช้งานสำหรับฟังก์ชั่นอื่น ๆ ทั้งหมดในสคริปต์ของคุณแทนที่จะเป็นเพียงฟังก์ชั่นการโทรกลับ
var myJSON;
ถัดไปเป็นฟังก์ชั่นง่าย ๆ ในการเรียก json ของคุณโดยการฉีดสคริปต์ โปรดทราบว่าเราไม่สามารถใช้ jQuery ที่นี่เพื่อผนวกสคริปต์เข้ากับส่วนหัวของเอกสารเนื่องจาก IE ไม่สนับสนุนวิธีการ jQuery. append วิธีการ jQuery แสดงความคิดเห็นในรหัสด้านล่างจะทำงานบนเบราว์เซอร์อื่น ๆ ที่สนับสนุนวิธีการใช้ผนวก มันถูกรวมไว้เป็นข้อมูลอ้างอิงเพื่อแสดงความแตกต่าง
function getLocalJSON(json_url){
var json_script = document.createElement('script');
json_script.type = 'text/javascript';
json_script.src = json_url;
json_script.id = 'json_script';
document.getElementsByTagName('head')[0].appendChild(json_script);
// $('head')[0].append(json_script); DOES NOT WORK in IE (.append method not supported)
}
ถัดไปเป็นฟังก์ชันการโทรกลับแบบสั้นและเรียบง่าย (ที่มีชื่อเดียวกันกับ jsonp wrapper) เพื่อรับข้อมูลผลลัพธ์ json ลงในตัวแปรโกลบอล
function json_callback(response){
myJSON = response; // Clone response JSON to myJSON object
$('#json_script').remove(); // Remove json_script from the document
}
ขณะนี้ข้อมูล json สามารถเข้าถึงได้โดยฟังก์ชันใด ๆ ของสคริปต์โดยใช้เครื่องหมายจุด ตัวอย่างเช่น:
console.log(myJSON.a); // Outputs 'b' to console
console.log(myJSON.c); // Outputs 'd' to console
วิธีนี้อาจแตกต่างจากที่คุณเคยเห็น แต่มีข้อดีหลายประการ ก่อนอื่นไฟล์ jsonp เดียวกันสามารถโหลดแบบโลคัลหรือจากเซิร์ฟเวอร์โดยใช้ฟังก์ชันเดียวกัน เป็นโบนัส jsonp อยู่ในรูปแบบที่เป็นมิตรข้ามโดเมนและสามารถใช้กับ REST type API ได้อย่างง่ายดาย
จริงอยู่ที่ไม่มีฟังก์ชั่นการจัดการข้อผิดพลาด แต่ทำไมคุณต้องใช้มัน? หากคุณไม่สามารถรับข้อมูล json โดยใช้วิธีนี้คุณสามารถเดิมพันได้ว่าคุณมีปัญหาในตัว json และฉันจะตรวจสอบกับตัวตรวจสอบ JSON ที่ดี
JSON
eval()