Thư viện triển khai các thông số kỹ thuật mới nhất [bản nháp-2020-12, bản nháp-2019-09, bản nháp-07 và bản nháp-06] của tiêu chuẩn Lược đồ JSON và cung cấp tài liệu toàn diện bao gồm cả tiêu chuẩn và API riêng của thư viện
Trong khi PHP 8. 2 vẫn chưa được phát hành, chúng tôi đã có một cái nhìn thoáng qua về các tính năng mới được cung cấp trong phiên bản 8. 3 năm sau
Vào ngày 14 tháng 8, Juan Carlos Morales đã đề xuất Yêu cầu Nhận xét để giới thiệu
var_dump[json_validate['{ "test": { "foo": "bar" } }']];9…
RFC này giới thiệu một hàm mới gọi là json_validate[] để xác thực xem một chuỗi có chứa json hợp lệ hay không
Hầu hết các triển khai vùng người dùng đều sử dụng json_decode[] mà theo thiết kế sẽ tạo ra một ZVAL[object/array/etc. ] trong khi phân tích cú pháp chuỗi, nên sử dụng bộ nhớ và quá trình xử lý có thể được lưu
Hàm được đề xuất sẽ sử dụng cùng một trình phân tích cú pháp JSON đã tồn tại trong lõi PHP, cũng được sử dụng bởi json_decode[], điều này đảm bảo rằng những gì hợp lệ trong json_validate[] cũng hợp lệ trong json_decode[]
Đề xuất
Sự miêu tả
json_validate[string $json, int $depth = 512, int $flags = 0]: bool
Thông số
var_dump[json_validate['{ "test": { "foo": "bar" } }']];6
Chuỗi json đang được phân tích
Chức năng này chỉ hoạt động với các chuỗi được mã hóa UTF-8
Ghi chú
PHP triển khai một siêu bộ JSON như được chỉ định trong bản gốc » RFC 7159
var_dump[json_validate['{ "test": { "foo": "bar" } }']];7
Độ sâu lồng nhau tối đa của cấu trúc được giải mã
var_dump[json_validate['{ "test": { "foo": "bar" } }']];8
Mặt nạ bit của JSON_INVALID_UTF8_IGNORE. Hành vi của hằng số này được mô tả trên trang hằng số JSON
Giá trị trả về
Trả về true nếu chuỗi được truyền chứa json hợp lệ, ngược lại trả về false
ví dụ
1. Xác thực chuỗi json hợp lệ
var_dump[json_validate['{ "test": { "foo": "bar" } }']];
Kết quả sẽ là
bool[true]
2. Xác thực chuỗi json không hợp lệ
var_dump[json_validate['{ "": "": "" } }']];
Kết quả sẽ là
bool[false]
Lỗi trong quá trình xác thực có thể được tìm nạp bằng cách sử dụng json_last_error[] và/hoặc json_last_error_msg[]
Ghi chú chung từ cuộc thảo luận về RFC
Những người dùng khác nhau đã kiểm tra chức năng và thu được kết quả như đã hứa. Ngoài ra phản hồi của họ về nó là tích cực
Hầu hết cộng đồng trong danh sách gửi thư đều có ý kiến tích cực về RFC này và mong muốn nó được tích hợp vào PHP
Những người đã kiểm tra mã cũng đồng ý rằng triển khai nhỏ, dễ bảo trì và đồng thời mang lại lợi ích lớn cho việc triển khai nhỏ như vậy
Cộng đồng đã tham gia rất tích cực vào cuộc thảo luận về RFC và cung cấp tất cả các loại phản hồi hữu ích, đồng thời cũng dành thời gian để tự mình kiểm tra json_validate[]
Mặc dù không giảm xuống chỉ những ví dụ này, trong quá trình thảo luận trong danh sách gửi thư, một số người dùng đã bày tỏ
“Có, JSON được định dạng tốt từ một nguồn đáng tin cậy có xu hướng nhỏ. Nhưng một chức năng xác thực cũng cần xử lý JSON không được định dạng tốt, nếu không, bạn sẽ không cần xác thực nó. ”
“Nếu với một chức năng mới [json_validate[]], việc chống lại cuộc tấn công Từ chối dịch vụ đối với một số phần của API JSON trở nên dễ dàng hơn nhiều, thì đây có thể là một bổ sung tốt chỉ vì lý do bảo mật. ”
“Việc xác thực nhanh chóng/hiệu quả một định dạng giao tiếp phổ biến làm giảm khả năng tấn công của các cuộc tấn công Từ chối dịch vụ. ”
Dựa trên thảo luận về RFC trong danh sách gửi thư
Theo thiết kế, json_decode[] tạo ra một ZVAL [đối tượng/mảng/v.v. ] trong khi phân tích chuỗi, nên sử dụng bộ nhớ và xử lý chuỗi đó, điều đó là không cần thiết nếu điều duy nhất cần khám phá là chuỗi có chứa json hợp lệ hay không
Nhược điểm của việc sử dụng regex
Sử dụng biểu thức chính quy cho tác vụ này buộc phải triển khai khác nhau, dễ bị lỗi, khó bảo trì
Nhược điểm của giải pháp userland
Viết một trình phân tích cú pháp JSON không phải là chuyện nhỏ
Chúng cần được cập nhật với trình phân tích cú pháp PHP JSON hiện có được sử dụng bởi json_decode[], nếu không, chuỗi json hợp lệ trong giải pháp userland có thể không phải là chuỗi json hợp lệ cho json_decode[] hoặc ngược lại
Công việc dư thừa là viết Trình phân tích cú pháp JSON trong vùng người dùng, vì PHP đã có một trình phân tích cú pháp JSON
PHP đã có trình phân tích cú pháp JSON
Như đã đề cập trước đó, PHP đã có một trình phân tích cú pháp JSON được sử dụng bởi json_decode[]. Hàm được đề xuất sẽ sử dụng trình phân tích cú pháp đó, đảm bảo khả năng tương thích 100% giữa json_decode[] và json_validate[]
Nhu cầu từ các dự án lớn và nhà phát triển
Trong phần “Tham khảo”, có một danh sách các dự án php nguồn mở lớn có thể hưởng lợi với chức năng mới này
Ngoài ra, trong phần được đề cập, một liên kết đến một trong những câu hỏi phổ biến nhất về StackOverflow được cung cấp, bằng cách nào đó phản ánh nhu cầu của các nhà phát triển của chúng tôi về việc bao gồm một tính năng như thế này
Vui lòng kiểm tra phần “Tài liệu tham khảo”
Độ phức tạp được thêm vào trong lõi
Hiện tại, có một trình phân tích cú pháp JSON trong lõi, được sử dụng bởi json_decode[] để thực hiện công việc của nó, vì vậy không cần phải viết một trình phân tích cú pháp JSON mới cho RFC này; . trong bộ nhớ cho nó
Một thành viên của danh sách gửi thư bày tỏ rằng
Kết hợp một triển khai nhỏ như vậy có thể đạt được với mã vùng người dùng không phải là một ý tưởng hay
Trích dẫn
“Nếu chúng ta tiếp tục xu hướng làm ô nhiễm thư viện tiêu chuẩn vốn đã cồng kềnh bằng một đội quân các chức năng nhỏ không thể tồn tại và được thay thế bằng các đối tác PHP bình thường IMHO, chúng ta sẽ kết thúc với sự thất vọng từ các nhà phát triển vì tôi tin rằng DX đang dần sụp đổ tại đây. ”
json_validate[] sẽ chỉ hữu ích cho các trường hợp Edge
Trích dẫn
“`json_decode[]` là một thay thế mà IMO giải quyết được 99% các trường hợp sử dụng. Nếu tôi tuân theo logic của bạn và chấp nhận mọi bổ sung nhỏ xử lý 1% trường hợp sử dụng, ai đó sẽ tăng RFC khác cho simplexml_validate_string hoặc yaml_validate và PhpToken tiếp theo. xác thực. Tất cả những điều trên có thể hợp lệ nếu chúng tôi tin tưởng rằng mọi người thường xác thực tải trọng 300 MB để không làm gì nếu họ KHÔNG thất bại và không có gì lạ về điều đó. ”
Những thay đổi trong RFC đã xảy ra trong quá trình thảo luận
Ném ngoại lệ khi có lỗi
Trong quá trình triển khai ban đầu của tôi, nhà phát triển có tùy chọn cung cấp cờ để chỉ ra rằng trong trường hợp có lỗi trong quá trình xác thực, một ngoại lệ sẽ được đưa ra
Khả năng đưa ra một ngoại lệ do lỗi đã bị loại bỏ khỏi quá trình triển khai, vì điều này không chỉ được hầu hết người dùng trong danh sách gửi thư chỉ ra [với lý do chính đáng], mà còn trong quá trình xem xét mã;
Tôi cũng phải thừa nhận rằng sau khi họ đưa ra lý lẽ của mình, tôi đã thay đổi suy nghĩ của mình và bây giờ tôi cũng nghĩ rằng có một hành vi như vậy trong chức năng
Vì vậy, việc loại bỏ khả năng ném ngoại lệ do lỗi đã bị xóa khỏi quá trình triển khai
Người khác
Tôi đã xóa 3 trong số các ví dụ được cung cấp ban đầu trong RFC vì không phù hợp với mục đích của RFC hoặc không rõ ràng
Tôi đã phải điều chỉnh từ ngữ trong tài liệu RFC này về nhược điểm của việc sử dụng json_decode[] như được chỉ ra tại đây
Thay đổi không tương thích ngược
Không có, vì đây chỉ là chức năng mới
json_validate sẽ không còn khả dụng dưới dạng tên hàm
[Các] Phiên bản PHP được đề xuất
Tác động RFC
RFC này không ảnh hưởng đến SAPI, các tiện ích mở rộng hiện có, Opcache, v.v.
Phạm vi tương lai
- [Sẽ được xác định bởi các cuộc thảo luận trong tương lai nếu cần]
Lựa chọn bỏ phiếu được đề xuất
Thực hiện
Người giới thiệu
Các dự án nguồn mở lớn sẽ được hưởng lợi từ điều này
Khung Symfony
________số 8Khung Laravel
public function validateJson[$attribute, $value] { if [is_array[$value]] { return false; } if [! is_scalar[$value] && ! is_null[$value] && ! method_exists[$value, '__toString']] { return false; } json_decode[$value]; return json_last_error[] === JSON_ERROR_NONE; }
Khung Laravel
var_dump[json_validate['{ "test": { "foo": "bar" } }']];0
Magento
var_dump[json_validate['{ "test": { "foo": "bar" } }']];1
Magento
var_dump[json_validate['{ "test": { "foo": "bar" } }']];2
getgrav
var_dump[json_validate['{ "test": { "foo": "bar" } }']];0
Tôn trọng / Xác nhận
var_dump[json_validate['{ "test": { "foo": "bar" } }']];1
Tôn trọng / Xác nhận
var_dump[json_validate['{ "test": { "foo": "bar" } }']];1
cửa hàng chuẩn bị
var_dump[json_validate['{ "test": { "foo": "bar" } }']];3
WordpressCLI
var_dump[json_validate['{ "test": { "foo": "bar" } }']];4
CMS JOOMLA
var_dump[json_validate['{ "test": { "foo": "bar" } }']];5
Trong PHP, câu hỏi này là một trong những câu hỏi được xếp hạng cao nhất liên quan đến json && php trong stackoverflow, “Cách nhanh nhất để kiểm tra xem một chuỗi có phải là JSON trong PHP không?”. Câu hỏi
Đã xem 484 nghìn lần. Bảng xếp hạng
Người hỏi cách thực hiện chính xác điều này, đồng thời cung cấp trường hợp sử dụng thực tế; . Trong Python