Cảnh báo: Đối với các phương thức dựa vào JSON.parse
- Mảng và trích dẫn các chuỗi được bao quanh cũng sẽ vượt qua (ví dụ. console.log(JSON.parse('[3]'), JSON.parse('"\uD800"'))
)
Để tránh tất cả các nguyên hàm JSON không phải đối tượng (boolean, null, mảng, số, chuỗi), tôi khuyên bạn nên sử dụng như sau:
/* Validate a possible object ie. o = { "a": 2 } */
const isJSONObject = (o) =>
!!o && (typeof o === 'object') && !Array.isArray(o) &&
(() => { try { return Boolean(JSON.stringify(o)); } catch { return false } })()
/* Validate a possible JSON object represented as string ie. s = '{ "a": 3 }' */
function isJSONObjectString(s) {
try {
const o = JSON.parse(s);
return !!o && (typeof o === 'object') && !Array.isArray(o)
} catch {
return false
}
}
Giải thích mã
- !! o - Không giả mạo (không bao gồm null, đăng ký dưới dạng typeof 'object')
- (typeof o === 'object') - Không bao gồm boolean, số và chuỗi
- ! Array.isArray (o) - Loại trừ các mảng (đăng ký dưới dạng typeof 'object')
- thử ... JSON.opesify / JSON.parse - Yêu cầu công cụ JavaScript để xác định xem JSON hợp lệ
Tại sao không sử dụng câu trả lời hasJsonStr struct ()?
Dựa vào toString()
không phải là một ý tưởng tốt. Điều này là do các Công cụ JavaScript khác nhau có thể trả về một đại diện chuỗi khác nhau. Nói chung, các phương pháp dựa vào điều này có thể thất bại trong các môi trường khác nhau hoặc có thể bị lỗi sau này nếu động cơ thay đổi kết quả chuỗi
Tại sao bắt một ngoại lệ không phải là hack?
Nó đã được đưa ra rằng bắt một ngoại lệ để xác định tính hợp lệ của một cái gì đó không bao giờ là cách đúng đắn. Đây thường là lời khuyên tốt, nhưng không phải lúc nào cũng vậy. Trong trường hợp này, việc bắt ngoại lệ có khả năng là con đường tốt nhất vì nó phụ thuộc vào việc triển khai xác thực dữ liệu JSON của công cụ JavaScript.
Dựa vào công cụ JS cung cấp các lợi thế sau:
- Cẩn thận hơn và liên tục cập nhật hơn khi thông số JSON thay đổi
- Có khả năng chạy nhanh hơn (vì nó là mã cấp thấp hơn)
Khi có cơ hội dựa vào công cụ JavaScript, tôi khuyên bạn nên làm điều đó. Đặc biệt là như vậy trong trường hợp này. Mặc dù có thể cảm thấy khó khăn khi bắt ngoại lệ, bạn thực sự chỉ cần xử lý hai trạng thái trả về có thể có từ một phương thức bên ngoài.
eval()
nếu nó trả vềundefined
sau đó, nó không phải là JSON