มาปะยางนี้กัน (สำหรับปี 2019+)
อาร์กิวเมนต์ : ค่าเช่นtrue
, false
, null
ที่ถูกต้อง JSON (?)
ข้อเท็จจริง : ค่าดั้งเดิมเหล่านี้สามารถแยกวิเคราะห์JSON ได้แต่ไม่มีโครงสร้าง JSON ที่มีรูปแบบที่ดี ข้อมูลจำเพาะJSON ระบุว่า JSON ถูกสร้างขึ้นบนสองโครงสร้าง: ชุดของคู่ชื่อ / ค่า (วัตถุ) หรือรายการค่าสั่งซื้อ (อาร์เรย์)
อาร์กิวเมนต์ : การจัดการข้อยกเว้นไม่ควรใช้เพื่อทำสิ่งที่คาดหวัง
(นี่คือความคิดเห็นที่มีผู้โหวตมากกว่า 25 คน!)
ความจริง : ไม่! มันถูกกฎหมายที่จะใช้ลอง / จับโดยเฉพาะอย่างยิ่งในกรณีเช่นนี้ มิฉะนั้นคุณจะต้องทำสิ่งต่าง ๆ ในการวิเคราะห์สตริงเช่นการดำเนินการ tokenizing / regex ซึ่งจะมีประสิทธิภาพที่แย่มาก
hasJsonStructure()
สิ่งนี้มีประโยชน์หากเป้าหมายของคุณคือการตรวจสอบว่าข้อมูล / ข้อความบางส่วนมีรูปแบบการแลกเปลี่ยน JSON ที่เหมาะสม
function hasJsonStructure(str) {
if (typeof str !== 'string') return false;
try {
const result = JSON.parse(str);
const type = Object.prototype.toString.call(result);
return type === '[object Object]'
|| type === '[object Array]';
} catch (err) {
return false;
}
}
การใช้งาน:
hasJsonStructure('true') // —» false
hasJsonStructure('{"x":true}') // —» true
hasJsonStructure('[1, false, null]') // —» true
safeJsonParse()
และสิ่งนี้มีประโยชน์หากคุณต้องการระวังเมื่อแยกวิเคราะห์ข้อมูลบางอย่างเป็นค่า JavaScript
function safeJsonParse(str) {
try {
return [null, JSON.parse(str)];
} catch (err) {
return [err];
}
}
การใช้งาน:
const [err, result] = safeJsonParse('[Invalid JSON}');
if (err) {
console.log('Failed to parse JSON: ' + err.message);
} else {
console.log(result);
}
eval()
ถ้ามันกลับundefined
มาแล้วมันไม่ใช่ JSON