programing

json_decode는 JSON_ERROR_SYNTAX를 반환하지만 온라인 포메터는 JSON이 정상이라고 말합니다.

madecode 2023. 3. 22. 23:21
반응형

json_decode는 JSON_ERROR_SYNTAX를 반환하지만 온라인 포메터는 JSON이 정상이라고 말합니다.

아주 이상한 문제가 생겼어요.

JSON 웹 서비스를 사용하고 있습니다.

이 웹사이트 http://www.freeformatter.com/json-formatter.html#ad-output에서 확인해보니

다 괜찮아요.

단, 이 코드를 사용하여 JSON을 로드하면 다음과 같이 됩니다.

  $data = file_get_contents('http://www.mywebservice');

if(!empty($data))
{

    $obj = json_decode($data);

 switch (json_last_error()) {
    case JSON_ERROR_NONE:
        echo ' - JSON_ERROR_NONE';
    break;
    case JSON_ERROR_DEPTH:
        echo ' - JSON_ERROR_DEPTH';
    break;
    case JSON_ERROR_STATE_MISMATCH:
        echo ' - JSON_ERROR_STATE_MISMATCH';
    break;
    case JSON_ERROR_CTRL_CHAR:
        echo ' -  JSON_ERROR_CTRL_CHAR';
    break;
    case JSON_ERROR_SYNTAX:
        echo "\r\n\r\n - SYNTAX ERROR \r\n\r\n";
    break;
    case JSON_ERROR_UTF8:
        echo ' - JSON_ERROR_UTF8';
    break;
    default:
        echo ' - Unknown erro';
    break;
}

SYNSTARK ERROR 오류가 발생하였습니다.

전혀 도움이 되지 않습니다.

악몽이다.

PHP 5.5에서는 다음 기능을 사용할 수 있습니다.http://php.net/manual/en/function.json-last-error-msg.php

(하지만 아직 PHP 5.5를 설치하지 못했고, 이 함수로 더 자세한 정보를 얻을 수 있을지 모르겠습니다.)

저도 같은 문제에 직면했습니다만, 실제로는 숨겨진 문자가 몇 개 있기 때문에, 삭제해 주세요.다음은 많은 경우에 적용되는 글로벌 코드입니다.

<?php
$checkLogin = file_get_contents("http://yourwebsite.com/JsonData");

// This will remove unwanted characters.
// Check http://www.php.net/chr for details
for ($i = 0; $i <= 31; ++$i) { 
    $checkLogin = str_replace(chr($i), "", $checkLogin); 
}
$checkLogin = str_replace(chr(127), "", $checkLogin);

// This is the most common part
// Some file begins with 'efbbbf' to mark the beginning of the file. (binary level)
// here we detect it and we remove it, basically it's the first 3 characters 
if (0 === strpos(bin2hex($checkLogin), 'efbbbf')) {
   $checkLogin = substr($checkLogin, 3);
}

$checkLogin = json_decode( $checkLogin );
print_r($checkLogin);
?>

의 삭제BOM 마크의 경우에 경우가 있습니다.

function removeBOM($data) {
    if (0 === strpos(bin2hex($data), 'efbbbf')) {
       return substr($data, 3);
    }
    return $data;
}

BOM이 있으면 안 되는데 있으면 안 보여서 안 보여!!

HTML에서 BOM의 W3C 참조

수정할 파일이 많은 경우 BOM Cleaner를 사용하십시오.

json_decode 전에 stripslash를 문자열에 추가하는 문제를 해결했습니다.

$data = stripslashes($data); 
$obj = json_decode($data);

모든 것을 정리하기 위해 자동 수정 조치를 디코딩한 JSON 래퍼를 준비했습니다.최신 버전은 내 GitHub Gist에서 찾을 수 있습니다.

abstract class Json
{
    public static function getLastError($asString = FALSE)
    {
        $lastError = \json_last_error();

        if (!$asString) return $lastError;

        // Define the errors.
        $constants = \get_defined_constants(TRUE);
        $errorStrings = array();

        foreach ($constants["json"] as $name => $value)
            if (!strncmp($name, "JSON_ERROR_", 11))
                $errorStrings[$value] = $name;

        return isset($errorStrings[$lastError]) ? $errorStrings[$lastError] : FALSE;
    }

    public static function getLastErrorMessage()
    {
        return \json_last_error_msg();
    }

    public static function clean($jsonString)
    {
        if (!is_string($jsonString) || !$jsonString) return '';

        // Remove unsupported characters
        // Check http://www.php.net/chr for details
        for ($i = 0; $i <= 31; ++$i)
            $jsonString = str_replace(chr($i), "", $jsonString);

        $jsonString = str_replace(chr(127), "", $jsonString);

        // Remove the BOM (Byte Order Mark)
        // It's the most common that some file begins with 'efbbbf' to mark the beginning of the file. (binary level)
        // Here we detect it and we remove it, basically it's the first 3 characters.
        if (0 === strpos(bin2hex($jsonString), 'efbbbf')) $jsonString = substr($jsonString, 3);

        return $jsonString;
    }

    public static function encode($value, $options = 0, $depth = 512)
    {
        return \json_encode($value, $options, $depth);
    }

    public static function decode($jsonString, $asArray = TRUE, $depth = 512, $options = JSON_BIGINT_AS_STRING)
    {
        if (!is_string($jsonString) || !$jsonString) return NULL;

        $result = \json_decode($jsonString, $asArray, $depth, $options);

        if ($result === NULL)
            switch (self::getLastError())
            {
                case JSON_ERROR_SYNTAX :
                    // Try to clean json string if syntax error occured
                    $jsonString = self::clean($jsonString);
                    $result = \json_decode($jsonString, $asArray, $depth, $options);
                    break;

                default:
                    // Unsupported error
            }

        return $result;
    }
}

사용 예:

$json_data = file_get_contents("test.json");
$array = Json::decode($json_data, TRUE);
var_dump($array);
echo "Last error (" , Json::getLastError() , "): ", Json::getLastError(TRUE), PHP_EOL;

내 경우:

json_discriptions(jiscription_discription_jisson_string);

모든 해결책을 시도해 봤지만 결과는 나오지 않았고, 이것이 나에게 효과가 있었다.

도움이 되었으면 좋겠다

$data = str_replace('&quot;', '"', $data);

JSON_ERROR_CTRL_CHAR 와 JSON_ERROR_SYNTAX 를 수신하는 것과 같은 문제가 발생하고 있습니다.
이건 내 해결책이야

$content = json_decode(json_encode($content), true);

JSON을 보여주지 않았습니다만, 이 소리는 인수의 UTF-8 시퀀스가 무효인 것처럼 들립니다.대부분의 온라인 검증 프로그램에서는 검출할 수 없습니다.데이터가 UTF-8 인 것을 확인하고, 외국어 문자가 있는지 확인해 주세요.오류를 확인하기 위해 PHP5가 필요하지 않습니다.error_log()를 사용하여 문제를 기록합니다.

저도 같은 문제가 있었어요.다음 절차를 밟았습니다.

  1. JSON 텍스트 인코딩 변경

    $json = utf8_encode($json);
    
  2. 디코딩하기 전에 일반 텍스트를 보았습니다.난 이상한 상징들을 발견했어

    ï

  3. 그냥 벗어버리고

    $json = str_replace(array('ï',''), '',$json);
    

    제 JSON을 성공적으로 해독했습니다.

먼저 json 데이터를 정리한 후 로드하십시오.

따옴표로 묶어야 을 이스케이프할 필요가 없기 때문에 유효하지 . 이스케이프할 필요가 없으므로 JSON은 유효하지 않습니다.'★★★★★★ 。

char = unescaped /
  escape (
      %x22 /          ; "    quotation mark  U+0022
      %x5C /          ; \    reverse solidus U+005C
      %x2F /          ; /    solidus         U+002F
      %x62 /          ; b    backspace       U+0008
      %x66 /          ; f    form feed       U+000C
      %x6E /          ; n    line feed       U+000A
      %x72 /          ; r    carriage return U+000D
      %x74 /          ; t    tab             U+0009
      %x75 4HEXDIG )  ; uXXXX                U+XXXX

'록에없없 없없없다다

JSON에서 사용되는 특수 문자 목록을 참조하십시오.

\b  Backspace (ascii code 08)
\f  Form feed (ascii code 0C)
\n  New line
\r  Carriage return
\t  Tab
\"  Double quote
\\  Backslash character

상세한 것에 대하여는, 이 사이트를 봐 주세요.

저도 이 문제에 직면했고, 인터넷에서 몇 시간 동안 다른 해결책을 시도한 후 너무 답답했어요.파일의 인코딩은 BOM과 함께 UTF-8로 되어 있는 것을 알 수 있었습니다.var_dump()는 JSON 전에 이상한 문자를 에코하고 있었습니다.

작업중이던 sample.json 파일을 BOM을 포함한 UTF-8에서 UTF-8로 변환했습니다.VS CODE에서 아래를 settings.json에 추가하거나 아래 설정 코드가 아래와 같이 되어 있는지 확인합니다(작성하는 파일은 기본적으로 UTF-8로 인코딩됩니다).

"files.encoding": "utf8",

도구 모음에 (의 경우)json_decode()하려면 , UTF-8 로 필요가 있습니다.

여기에 이미지 설명 입력

하지만 내 경우, 내가 만든 JSON 파일은 BOM 인코딩을 가진 UTF-8을 가지고 있어서json_decode($json, true) 때의 ).var_dump(json_last_error_msg()))

여기에 이미지 설명 입력

  1. BOM이 있는 UTF-8을 클릭하면 드롭다운이 나타납니다.
  2. [ Save with Encoding ]을 클릭합니다.
  3. 아래 스크린샷을 찍은 후 UTF-8을 클릭합니다.

여기에 이미지 설명 입력

그러면 파일이 UTF-8 인코딩으로 다시 저장되고 코드를 확인할 수 있습니다. json_decode()정상적으로 동작합니다.뭐가 문제인지 알아내려고 몇 시간이나 걸렸다는 게 믿기지 않아.

해피 코딩!

저도 같은 문제에 직면했습니다.왜냐하면 담당 텍스트는 json처럼 보이지만 실제로는 HTML 형식의 텍스트이기 때문입니다.텍스트(json look-alike)를 JSON 형식으로 에코하여 실제 내부에 무엇이 있는지 확인할 수 있습니다.

$response = file_get_contents('http://www.mywebservice');
header('Content-Type: application/json');
echo $response;

이 함수 file_get_contents는 몇 가지 추가 HTML 코드를 반환합니다.저 같은 경우에는 불필요한 문자를 삭제합니다.

$response = str_replace('<head></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">', '',$response );
$response = str_replace('</pre></body>', '',$response );

다음은 완전한 코드입니다.

$response = file_get_contents('http://www.mywebservice');
$response = str_replace('<head></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">', '',$response );
$response = str_replace('</pre></body>', '',$response );
$response = json_decode($response);
header('Content-Type: application/json');            
$error = json_last_error_msg() ;
echo $error;

if ($error == null){echo "This is truly a JSON : <br>"}
echo $response;

제 문제 중 하나는 0으로 시작하는 잘못된 번호가 있다는 것입니다. 예: "001", "002", "003".

     "expectedToBeReturned":1,
     "inventoryNumber":001,
     "remindNote":"",

001을 1로 교체하면 작동합니다.

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★이었다.echo "<br/><pre>". "php" "json" 을 사용하여 을 전달하려고 exit(json_encode(utf8ize($resp_array)));파일의 선두에 브레이크 라인 태그가 삭제되어 있었습니다.그래서 이건 저에게 오류였습니다.브레이크 라인 태그를 제거함으로써 다른 php 파일에 대해 json 문자열을 디코딩할 수 있었습니다.

저도 같은 문제가 있었어요.나는 그것이 원인이었다.echo "<br/><pre>".

다음 명령을 사용하여 다른 php 파일에 json 문자열을 전달하려고 했습니다.

exit(json_encode(utf8ize($resp_array)));

파일의 선두에 브레이크 라인 태그가 삭제되어 있었습니다.그래서 이건 저에게 오류였습니다.이 브레이크 라인 태그를 제거하여 [...]할 수 있었습니다.

이 암호는 나에게 효과가 있었어.기본적으로 숨겨진 문자를 제거합니다.

    function cleanString($val)
    {
        $non_displayables = array(
        '/%0[0-8bcef]/',            # url encoded 00-08, 11, 12, 14, 15
        '/%1[0-9a-f]/',             # url encoded 16-31
        '/[\x00-\x08]/',            # 00-08
        '/\x0b/',                   # 11
        '/\x0c/',                   # 12
        '/[\x0e-\x1f]/',            # 14-31
        '/x7F/'                     # 127
        );
        foreach ($non_displayables as $regex)
        {
            $val = preg_replace($regex,'',$val);
        }
        $search  = array("\0","\r","\x1a","\t");
        return trim(str_replace($search,'',$val));
    }

언급URL : https://stackoverflow.com/questions/17219916/json-decode-returns-json-error-syntax-but-online-formatter-says-the-json-is-ok

반응형