>  기사  >  백엔드 개발  >  php json_decode 구문 분석이 실패하면 어떻게 해야 할까요?

php json_decode 구문 분석이 실패하면 어떻게 해야 할까요?

藏色散人
藏色散人원래의
2021-09-10 09:38:374366검색

PHP json_decode 구문 분석 실패에 대한 해결 방법: 1. json_last_error 및 기타 기능을 통해 오류 코드를 얻습니다. 2. utf8 인코딩 범위에 따라 잘못된 utf8 문자를 제거합니다.

php json_decode 구문 분석이 실패하면 어떻게 해야 할까요?

이 기사의 운영 환경: Windows 7 시스템, PHP 버전 7.1, DELL G3 컴퓨터

php json_decode 구문 분석에 실패하면 어떻게 해야 합니까?

php json_decode 구문 분석 실패 및 오류 처리

일반적으로 json 콘텐츠를 얻으면 json_decode($content, true)를 배열로 직접 변환하여 사용할 수 있어 매우 편리합니다.
그러나 json 콘텐츠를 제공하는 인터페이스에 문제가 있고, 제공된 json이 표준이 아니거나 단순히 오류가 있는 경우 문제를 찾을 수 있는 방법을 찾아야 합니다.
먼저 json_encode 매뉴얼을 살펴보겠습니다
https://www.php.net/manual/en/function.json-last-error.php

실패하면 NULL을 반환합니다

 //  $json = '{"a":1,"b":2,"c":3,"d":4,"e":5, "name":"Corwien"}'; 
 $json = '{"a":1,"b":2,"c":3,"d":4,"e":5, "name":}';  //错误的json格式
 $result = json_decode($json, true);
  if(!$result)
  {
        //error handle ,错误处理
        $ret = json_last_error();
        print_r($ret);   //打印为: 4,查错误信息表,可知是语法错误
        
  }   

json_last_error错误msg对照表:
0 = JSON_ERROR_NONE
1 = JSON_ERROR_DEPTH
2 = JSON_ERROR_STATE_MISMATCH
3 = JSON_ERROR_CTRL_CHAR
4 = JSON_ERROR_SYNTAX
5 = JSON_ERROR_UTF8

어떻게 하나요? 모직물이 어디 있는지 알아요?

1. 오류 코드 가져오기

php에는 json_last_error 함수가 있습니다.
https://www.php.net/manual/en/function.json-last-error.php

를 참조하세요. 오류가 반환됩니다. 우리에게 무엇이 잘못되었는지 알려주는 코드입니다.
오류 코드를 이해할 수 없나요? json_last_error_msg를 사용할 수 있습니다.
https://www.php.net/manual/en/function.json-last-error-msg.php

를 참조하세요. 하지만 json_last_error_msg는 php >= 5.5.0 버전에서만 사용할 수 있습니다. 버전이 낮으면 직접 정의하세요.

2. 낮은 버전의 php json 오류 코드는 불완전합니다

그러나 매뉴얼을 주의 깊게 살펴보면 json_last_error에 정의된 많은 오류 코드는 높은 버전에서만 사용할 수 있으며, 낮은 버전에서는 PHP 버전이 중단되었습니다. 예를 들어, JSON_ERROR_UTF8 오류 코드는 json 문자열에 잘못된 utf8 문자가 있음을 명확하게 알려주지만 이는 Php >= 5.3.3에서만 사용할 수 있습니다. 매우 비극적인 점은 내 PHP가 5.3.2라는 것입니다....

所以,如果你的json_last_error返回的是JSON_ERROR_NONE(0) ,并不是说没有错误,而只是这个错误在你的低版本php中没有定义。再说,没有错误怎么会失败呢....

json 형식이 잘못되면 PHP 버전이 아무리 낮더라도 JSON_ERROR_SYNTAX를 알려줍니다. 따라서 JSON_ERROR_NONE을 만나면 가장 먼저 가능성은 불법 utf8 문자를 사용하는 것입니다. 문자열 생각입니다.

3. json에서 불법 utf8 문자를 처리하는 방법

utf8의 인코딩 범위에 따라 불법 utf8 문자를 제거할 수 있습니다.
https://magp.ie/2011/01/06/remove-non-utf8-characters-from-string-with-php/

//reject overly long 2 byte sequences, as well as characters above U+10000 and replace with ?
$some_string = preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]'.
 '|[\x00-\x7F][\x80-\xBF]+'.
 '|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*'.
 '|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})'.
 '|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/S',
 '?', $some_string );
 
//reject overly long 3 byte sequences and UTF-16 surrogates and replace with ?
$some_string = preg_replace('/\xE0[\x80-\x9F][\x80-\xBF]'.
 '|\xED[\xA0-\xBF][\x80-\xBF]/S','?', $some_string );

를 참조하세요. 잘못된 문자를 ?로 바꾸고 필요에 따라 변경하세요.

추천 학습: "PHP 비디오 튜토리얼"

위 내용은 php json_decode 구문 분석이 실패하면 어떻게 해야 할까요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.