2010-02-27 37 views
36

Tôi đang cố gắng xử lý dữ liệu json xấu khi được phân tích cú pháp thông qua json_decode(). Tôi đang sử dụng các kịch bản sau đây:Phát hiện dữ liệu json xấu trong PHP json_decode()?

if(!json_decode($_POST)) { 
    echo "bad json data!"; 
    exit; 
} 

Nếu $ _POST bằng:

'{ bar: "baz" }' 

Sau đó json_decode xử lý tiền phạt lỗi và spits ra; "dữ liệu json xấu!" Tuy nhiên, nếu tôi đặt $ _POST để một cái gì đó như "dữ liệu không hợp lệ", nó mang lại cho tôi:

Warning: json_decode() expects parameter 1 to be string, array given in C:\server\www\myserver.dev\public_html\rivrUI\public_home\index.php on line 6 
bad json data! 

Tôi có cần phải viết một kịch bản tùy chỉnh để phát hiện dữ liệu json hợp lệ, hoặc là có một số cách tiện lợi khác để phát hiện điều này?

+0

'$ _POST' luôn là một mảng c ontaining các thông số * x-www-form-urlencoded * được truyền qua POST. Làm thế nào để bạn gửi dữ liệu của bạn vào kịch bản PHP của bạn? – Gumbo

+0

Các hàm json đi kèm trong PHP không có nhiều trợ giúp. Họ có rất nhiều vấn đề. Hãy xem [json.org] (http://json.org/) để tìm một thư viện tốt. – whiskeysierra

Trả lời

82

Dưới đây là một vài điều về json_decode:

  • nó trả về dữ liệu, hoặc null khi có một lỗi
  • nó cũng có thể trở lại null khi không có lỗi: khi chuỗi JSON chứa null
  • nó làm tăng cảnh báo khi có cảnh báo - cảnh báo bạn muốn biến mất.


Để giải quyết vấn đề cảnh báo, một giải pháp sẽ được sử dụng @ operator(Tôi không thường khuyên bạn sử dụng nó, vì nó làm cho debuging rất nhiều khó khăn ... Nhưng ở đây, không có nhiều sự lựa chọn):

$_POST = array(
    'bad data' 
); 
$data = @json_decode($_POST); 

bạn muốn sau đó phải kiểm tra nếu $datanull - và, để tránh trường hợp trong đó json_decode lợi nhuận null cho null trong chuỗi JSON, bạn có thể c quái json_last_error, mà (trích dẫn):

Trả về lỗi cuối cùng (nếu có) xảy ra cuối cùng bởi phân tích cú pháp JSON.


Có nghĩa là bạn sẽ phải sử dụng một số mã như sau:

if ($data === null 
    && json_last_error() !== JSON_ERROR_NONE) { 
    echo "incorrect data"; 
} 
10

Bạn cũng có thể sử dụng json_last_error: http://php.net/manual/en/function.json-last-error.php

mà như tài liệu nói:

Trả về lỗi cuối cùng (nếu có) xảy ra trong JSONcuối cùngmã hóa/giải mã.

đây là một ví dụ

+6

Điều này hoàn toàn không cần thiết trong PHP 5.5 với http://php.net/manual/en/function.json-last-error-msg.php – vvondra

1

Tôi chỉ phá vỡ đầu tôi hơn một lỗi cú pháp JSON trong những gì dường như là json hoàn hảo: { "test1": "xe hơi", "test2": "tự động "} từ chuỗi được mã hóa url.

Nhưng trong trường hợp của tôi, một số mã ở trên đã được mã hóa html, khi thêm html_entity_decode($string) đã thực hiện thủ thuật.

$ft = json_decode(html_entity_decode(urldecode(filter_input(INPUT_GET, 'ft', FILTER_SANITIZE_STRING)))); 

Hy vọng điều này sẽ giúp người khác tiết kiệm thời gian.

1

/** * * tùy chỉnh json_decode * lỗi xử lý json_decode * * Loại @ param $ json_text * Loại @return */ public static function custom_json_decode ($ json_text) {

$decoded_array = json_decode($json_text, TRUE); 
    switch (json_last_error()) { 
     case JSON_ERROR_NONE: 
      return array(
       "status" => 0, 
       "value" => $decoded_array 
      ); 


     case JSON_ERROR_DEPTH: 
      return array(
       "status" => 1, 
       "value" => 'Maximum stack depth exceeded' 
      ); 

     case JSON_ERROR_STATE_MISMATCH: 
      return array(
       "status" => 1, 
       "value" => 'Underflow or the modes mismatch' 
      ); 

     case JSON_ERROR_CTRL_CHAR: 
      return array(
       "status" => 1, 
       "value" => 'Unexpected control character found' 
      ); 

     case JSON_ERROR_SYNTAX: 
      return array(
       "status" => 1, 
       "value" => 'Syntax error, malformed JSON' 
      ); 

     case JSON_ERROR_UTF8: 
      return array(
       "status" => 1, 
       "value" => 'Malformed UTF-8 characters, possibly incorrectly encoded' 
      ); 

     default: 
      return array(
       "status" => 1, 
       "value" => 'Unknown error' 
      ); 
    } 
} 
1

Đây là cách Guzzle xử lý json

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