Hướng dẫn php check is json - kiểm tra php là json

Cách nhanh nhất là "có thể giải mã" chuỗi JSON có thể

Đây thực sự là phương pháp nhanh nhất?

Nếu bạn muốn giải mã các đối tượng phức tạp hoặc các mảng lớn hơn, đây là giải pháp nhanh nhất! Bên cạnh việc nhanh chóng, đây là giải pháp duy nhất có thể xử lý đáng tin cậy bất kỳ loại giá trị đầu vào nào - các chức năng khác ném lỗi hoặc trả về kết quả không chính xác trong một số trường hợp.fastest solution! Besides being fast, this is the only solution that can reliably handle any kind of input value - other functions throw errors or return incorrect results in some cases.

Nếu chuỗi JSON của bạn chứa các giá trị ngắn (ví dụ: chuỗi, số hoặc đối tượng chỉ có 1-2 thuộc tính) thì tất cả các giải pháp trong vấn đề này để các câu hỏi đi đến một hiệu suất tương tự.similar performance.

Dưới đây là một cái nhìn tổng quan nhanh chóng với so sánh - bạn có thể tìm thấy các trường hợp kiểm tra trong ý chính được liên kết. Cột cuối cùng sử dụng mã từ câu trả lời này:

PHP version: 7.4.21

test1: json_last_error() == JSON_ERROR_NONE
test2: is_object( json_decode() )
test3: json_decode() && $res != $string
test4: preg_match()
test5: "maybe decode" approach

      | test1    | test2    | test3    | test4    | test5    
   #0 | 0.0147   | 0.0109 ✓︎ | 0.0119   | 0.0177   | 0.0194   
   #1 | 0.0129   | 0.0106   | 0.0098   | - INV -  | 0.0078 ✓︎ 
   #2 | 0.0076   | 0.0075   | 0.0063 ✓︎ | 0.0083   | 0.0133   
   #3 | 0.0126   | 0.0105   | 0.0096 ✓︎ | - INV -  | 0.0172   
   #4 | 0.0070   | - INV -  | 0.0061 ✓︎ | 0.0141   | 0.0134   
   #5 | 0.0114   | - INV -  | 0.0101   | 0.0075 ✓︎ | 0.0168   
   #6 | 0.0203   | - INV -  | 0.0195   | 0.0073 ✓︎ | 0.0259   
   #7 | 0.0046   | - INV -  | - INV -  | 0.0077   | 0.0031 ✓︎ 
   #8 | 0.0066   | - INV -  | - INV -  | 0.0081   | 0.0020 ✓︎ 
   #9 | 1.0781   | - INV -  | 1.0555   | 0.0998 ✓︎ | 1.0385   
  #10 | 0.3183 ✓︎ | 0.3246   | 0.3270   | 1.0186   | 0.3311   
  #11 | 0.0071   | 0.0068   | 0.0067 ✓︎ | - INV -  | 0.0079   
  #12 | - ERR -  | - ERR -  | - ERR -  | - ERR -  | 0.0025 ✓︎ 
  #13 | - ERR -  | - ERR -  | - ERR -  | - ERR -  | 0.0024 ✓︎ 
  Avg | 0.1251   | 0.0618 ✓︎ | 0.1463   | 0.1321   | 0.1072

Lưu ý rằng giải pháp nhanh nhất tạo ra kết quả không chính xác nhất. Từ tất cả các giải pháp khác, phương pháp "có thể giải mã" không chỉ là nhanh nhất mà còn là giải pháp duy nhất có kết quả chính xác.

Dưới đây là tập lệnh so sánh hiệu suất đầy đủ, ở đó bạn có thể thấy dữ liệu thử nghiệm mà tôi đã sử dụng để so sánh: https://gist.github.com/stracker-phil/6a80e6faedea8dab090b4bf6668ee461


Logic/mã "có thể giải mã"

Trước tiên chúng tôi thực hiện một số kiểm tra loại và so sánh chuỗi trước khi thử giải mã chuỗi JSON. Điều này cho chúng ta hiệu suất tốt nhất vì json_decode () có thể chậm.

/**
 * Returns true, when the given parameter is a valid JSON string.
 */
function is_json( $value ) {
    // Numeric strings are always valid JSON.
    if ( is_numeric( $value ) ) { return true; }

    // A non-string value can never be a JSON string.
    if ( ! is_string( $value ) ) { return false; }

    // Any non-numeric JSON string must be longer than 2 characters.
    if ( strlen( $value ) < 2 ) { return false; }

    // "null" is valid JSON string.
    if ( 'null' === $value ) { return true; }

    // "true" and "false" are valid JSON strings.
    if ( 'true' === $value ) { return true; }
    if ( 'false' === $value ) { return true; }

    // Any other JSON string has to be wrapped in {}, [] or "".
    if ( '{' != $value[0] && '[' != $value[0] && '"' != $value[0] ) { return false; }

    // Verify that the trailing character matches the first character.
    $last_char = $value[strlen($value) -1];
    if ( '{' == $value[0] && '}' != $last_char ) { return false; }
    if ( '[' == $value[0] && ']' != $last_char ) { return false; }
    if ( '"' == $value[0] && '"' != $last_char ) { return false; }

    // See if the string contents are valid JSON.
    return null !== json_decode( $value );
}

Thêm: Sử dụng logic này để JSON mã hóa đôi một cách an toàn

Hàm này sử dụng cùng một logic nhưng trả về đối tượng JSON được giải mã hoặc giá trị ban đầu.returns the decoded JSON object or the original value.

Tôi sử dụng chức năng này trong trình phân tích cú pháp giải mã đệ quy một đối tượng phức tạp. Một số thuộc tính có thể được giải mã bằng cách lặp trước đó. Chức năng đó nhận ra điều này và không cố gắng giải mã lại giá trị một lần nữa.

/**
 * Tests, if the given $value parameter is a JSON string.
 * When it is a valid JSON value, the decoded value is returned.
 * When the value is no JSON value (i.e. it was decoded already), then 
 * the original value is returned.
 */
function get_data( $value, $as_object = false ) {
    if ( is_numeric( $value ) ) { return 0 + $value; }
    if ( ! is_string( $value ) ) { return $value; }
    if ( strlen( $value ) < 2 ) { return $value; }
    if ( 'null' === $value ) { return null; }
    if ( 'true' === $value ) { return true; }
    if ( 'false' === $value ) { return false; }
    if ( '{' != $value[0] && '[' != $value[0] && '"' != $value[0] ) { return $value; }

    $json_data = json_decode( $value, $as_object );
    if ( is_null( $json_data ) ) { return $value; }
    return $json_data;
}

Lưu ý: Khi chuyển một chuỗi không đến bất kỳ giải pháp nào khác trong câu hỏi này, bạn sẽ nhận được hiệu suất xuống cấp đáng kể + giá trị trả về sai (hoặc thậm chí các lỗi gây tử vong). Mã này là chống đạn và hiệu suất cao.non-string to any of the other solution in this SO question, you will get dramatically degraded performance + wrong return values (or even fatal errors). This code is bulletproof and highly performant.