2009-07-27 48 views
36

Có ai biết đoạn mã hàm is_JSON mạnh mẽ (và bullet) cho PHP không? Tôi (rõ ràng) có một tình huống mà tôi cần phải biết nếu một chuỗi là JSON hay không.Làm thế nào để xác định xem một chuỗi là JSON hợp lệ?

Hmm, có thể chạy thông qua yêu cầu/đáp ứng JSONLint, nhưng điều đó có vẻ hơi quá mức.

+1

Chụp; Tôi đã có một giải pháp chống đạn tiện dụng, nhưng nó không phải là rất mạnh mẽ, vì vậy tôi đã phải cạo nó: P –

Trả lời

60

Nếu bạn đang sử dụng được xây dựng trong json_decode chức năng PHP, json_last_error trả về lỗi cuối cùng (ví dụ JSON_ERROR_SYNTAX khi chuỗi của bạn không phải là JSON).

Thường thì json_decode trả về null.

+3

Vâng, tôi là một thằng ngốc. Điều này là hiển nhiên và tôi đã bỏ lỡ nó. Tôi có thể quấn nó vào những gì tôi cần. Cảm ơn. – Spot

+0

Giải pháp rắn trong hầu hết các trường hợp, nhưng hãy cẩn thận. json_decode cũng có thể phân tích cú pháp ví dụ: chuỗi số. Một số điện thoại trong một chuỗi sẽ được chuyển đổi thành một số nguyên. Tuy nhiên, điều này không xảy ra trên mọi máy chủ. Trên máy tính cửa sổ của tôi tôi nhận được số nguyên, trên hệ thống phát triển linux tôi nhận được sai. Tôi giả sử nó phụ thuộc vào cài đặt và cấu hình PHP của bạn – StoryTeller

+0

Như StoryTeller đã đề cập - json_decode ("51232") đánh giá là 51232, vì vậy có thể không hữu ích trong mọi tình huống –

17

Điều gì về việc sử dụng json_decode, nên trả lại null nếu chuỗi đã cho không phải là dữ liệu được mã hóa JSON hợp lệ phải không?

Xem ví dụ 3 trên trang hướng dẫn:

// the following strings are valid JavaScript but not valid JSON 

// the name and value must be enclosed in double quotes 
// single quotes are not valid 
$bad_json = "{ 'bar': 'baz' }"; 
json_decode($bad_json); // null 

// the name must be enclosed in double quotes 
$bad_json = '{ bar: "baz" }'; 
json_decode($bad_json); // null 

// trailing commas are not allowed 
$bad_json = '{ bar: "baz", }'; 
json_decode($bad_json); // null 
4

Không json_decode() với json_last_error() có phù hợp với bạn không? Bạn đang tìm kiếm chỉ là một phương pháp để nói "thực hiện điều này giống như JSON" hoặc thực sự xác nhận nó? json_decode() sẽ là cách duy nhất để xác thực hiệu quả trong PHP.

3
 
$this->post_data = json_decode(stripslashes($post_data)); 
    if($this->post_data === NULL) 
    { 
    die('{"status":false,"msg":"The post_data parameter must be valid JSON"}'); 
    } 
13

Đối với dự án của tôi, tôi sử dụng chức năng này (hãy đọc phần "Note" trên json_decode() tài liệu).

Đi qua những lập luận tương tự như bạn sẽ vượt qua để json_decode(), bạn có thể phát hiện ứng dụng cụ thể "lỗi" (ví dụ như lỗi sâu)

Với PHP> = 5,6

// PHP >= 5.6 
function is_JSON(...$args) { 
    json_decode(...$args); 
    return (json_last_error()===JSON_ERROR_NONE); 
} 

Với PHP> = 5.3

// PHP >= 5.3 
function is_JSON() { 
    call_user_func_array('json_decode',func_get_args()); 
    return (json_last_error()===JSON_ERROR_NONE); 
} 

dụ Cách sử dụng:

$mystring = '{"param":"value"}'; 
if (is_JSON($mystring)) { 
    echo "Valid JSON string"; 
} else { 
    $error = json_last_error_msg(); 
    echo "Not valid JSON string ($error)"; 
} 
+0

Tôi không phải là chuyên gia về PHP, nhưng giải pháp này dường như không rất hiệu quả, như khi giải mã JSON là bắt buộc, nó thực hiện hai lần: một lần khi thử nghiệm nếu chuỗi là JSON hợp lệ và lần thứ hai khi thực sự giải mã nó. Có vẻ như nó sẽ khôn ngoan hơn nếu chỉ đơn giản là có hàm này chỉ kiểm tra lỗi JSON cuối cùng, giả sử rằng json_decode đã được thực thi. Tôi hoan nghênh các ý kiến ​​khác. –

+0

Xin chào @LiranH, áp phích ban đầu đã yêu cầu chức năng 'is_JSON' do đó tôi không thể giả định trong hàm json_decode vừa được thực hiện trên chuỗi được yêu cầu. Trong trường hợp đó, hàm của bạn sẽ được đặt tên là 'is_last_json_decoded_string_a_JSON_string'. – cgaldiolo

+0

Đủ công bằng @cgaldiolo –

Các vấn đề liên quan