programing

PHP: json_decode가 작동하지 않습니다.

bestprogram 2023. 4. 2. 12:01

PHP: json_decode가 작동하지 않습니다.

이것은 동작하지 않습니다.

$jsonDecode = json_decode($jsonData, TRUE);

그러나 문자열을 복사하면$jsonData수동으로 디코드 기능에 넣으면 동작합니다.

방법은 다음과 같습니다.

$jsonDecode = json_decode('{"id":"0","bid":"918","url":"http:\/\/www.google.com","md5":"6361fbfbee69f444c394f3d2fa062f79","time":"2014-06-02 14:20:21"}', TRUE);

출력을 했다.$jsonData복사하여 위와 같이 디코드 기능에 넣습니다.그리고 효과가 있었다.하지만 만약 내가$jsonData디코드 기능에서 직접 사용할 수 없습니다.

var_dump($jsonData)다음에 나타냅니다.

string(144) "{"id":"0","bid":"918","url":"http:\/\/www.google.com","md5":"6361fbfbee69f444c394f3d2fa062f79","time":"2014-06-02 14:20:21"}"

$jsonData암호화되어 있습니다.$_GET변수.암호화하려면 다음을 사용합니다.

$key = "SOME KEY";

$iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

$enc = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $data, MCRYPT_MODE_ECB, $iv);

$iv = rawurlencode(base64_encode($iv));
$enc = rawurlencode(base64_encode($enc));

//To Decrypt
$iv = base64_decode(rawurldecode($_GET['i']));
$enc = base64_decode(rawurldecode($_GET['e']));

$data = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $enc, MCRYPT_MODE_ECB, $iv);

html 엔티티의 문제가 있는 경우도 있습니다.예를 들어 다음과 같이 표시됩니다.따라서 html 엔티티를 실제 텍스트로 해석해야 합니다.이 경우 html 엔티티를 php의 html_syslog() 메서드를 사용하여 실행할 수 있습니다.

$jsonData = stripslashes(html_entity_decode($jsonData));

$k=json_decode($jsonData,true);

print_r($k);

json_decode의 늘 결과를 피하기 위해 preg_replace를 사용해야 합니다.

다음은 코드 예시입니다.

$json_string = stripslashes(html_entity_decode($json_string));
$bookingdata =  json_decode( preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $json_string), true ); 

대부분의 경우 복호화된 데이터에서 패딩을 제거해야 합니다.문자열에는 124개의 문자가 표시되지만var_dump보고서 144 입니다.즉, 20자의 패딩을 제거해야 합니다(문자열 끝에 일련의 "0" 바이트).

아마도 블록의 끝에 4 "\0" 바이트 + 빈 16 바이트 블록(데이터의 끝을 표시)이 있을 것입니다.

현재 문자열을 어떻게 해독/암호화하고 있습니까?

편집:

문자열 끝에 0 바이트를 트리밍하려면 이 값을 추가해야 합니다.

$jsonData = rtrim($jsonData, "\0");

다른 댓글로 판단하건대, 당신은 그것을 사용할 수 있다.

$jsonDecode = json_decode(trim($jsonData), TRUE);

php 7.1로 이동하는 동안 json_decode 오류 번호 4(json syntex 오류)가 발생했습니다.이 페이지의 위의 솔루션 중 어느 것도 나에게는 효과가 없었습니다.

좀 더 검색해 본 결과, https://stackoverflow.com/a/15423899/1545384에서 해결책을 찾았고, 나에게도 효과가 있었습니다.

//Remove UTF8 Bom

function remove_utf8_bom($text)
{
    $bom = pack('H*','EFBBBF');
    $text = preg_replace("/^$bom/", '', $text);
    return $text;
}

헤더를 반드시 JSON으로 설정하십시오.

header('Content-type: application/json;');

str_replace\t", ", str_replace\n", ", $string")

json_module은 특수문자와 함께 사용할 수 없기 때문입니다.에러는 표시되지 않습니다.탭 공간과 새 행을 삭제하십시오.취득하는 소스에 따라서는, stripslashes(html_entity_decode($string))도 필요하게 되는 경우가 있습니다.

효과적:

<?php

$sql = <<<EOT

    SELECT *
        FROM `students`;

EOT;
    $string = '{ "query" : "' . str_replace("\t", " ", str_replace("\n", " ", $sql)).'" }';
    print_r(json_decode($string));

?>

출력:

stdClass Object
(
    [query] =>          SELECT *      FROM `students`;     
)

나는 그것이 문제가 있었다.json_decode동작하지 않았습니다.해결책은 문자열 인코딩을 utf-8로 변경하는 것이었습니다.이는 라틴 문자가 아닌 경우 중요합니다.

흥미롭게도 mcrypt_decrypt는 패딩 알고리즘 때문에 결과 텍스트 끝에 \0 이외의 제어 문자를 추가하는 것으로 보입니다.따라서 대신rtrim($jsonData, "\0")를 사용하는 것이 좋습니다.

preg_replace( "/\p{Cc}*$/u", "", $data)

mcrypt_syslog.json_syslog의 결과 $data는 모든 후행 제어 문자를 삭제하면 동작합니다.http://php.net/manual/en/function.mdecrypt-generic.php 에서 Peter Bailey 의 코멘트를 참조해 주세요.

이 코드 사용

<?php 
   $json = preg_replace('/[[:cntrl:]]/', '', $json_data);
   $json_array = json_decode($json, true);
   echo json_last_error();
   echo json_last_error_msg();
   print_r($json_array);
?>

JSON이 실제로 유효한지 확인합니다.어떤 이유에서인지 나는 이것이 유효한 JSON이라고 확신했다.

{ type: "block" }

그렇지 않은 동안.을 확인하는 입니다.json_decode작동하지 않습니다.

JSON Validator 를 시험해 보겠습니다.

제 경우는 ''가 아닌 ''를 사용한 것이 문제였습니다.그래서 그것을 작동시키기 위해 교환을 해야 했습니다.

메모장+에서 json 파일의 인코딩을 "BOM이 없는 UTF-8"로 변경했습니다.JSON이 동작하기 시작했습니다.

TL;DR JSON에 코멘트가 포함되어 있지 않은지 확인합니다.

API 참조에서 JSON 구조를 가져와 Postman을 사용하여 요청을 테스트했습니다.방금 JSON을 복사 붙여넣은 상태인데, 그 안에 댓글이 있는지는 신경 쓰지 않았습니다.

...
"payMethod": {
    "type": "PBL" //or "CARD_TOKEN", "INSTALLMENTS"
},
...

물론 댓글 삭제 후 json_decode()는 마법처럼 동작하기 시작했습니다.

다음 기능을 사용합니다.

JSON_ERROR_UTF8이 발생한 경우:

$encoded = json_encode( utf_convert( $responseForJS ) );

아래 함수는 어레이 데이터를 재귀적으로 인코딩하는 데 사용됩니다.

/* 일부 손상된 UTF-8 문자를 json_model에 사용합니다. * json_model에 의해 잘못 인코딩된 = 형식의 utf-8 문자에 유용합니다. */

function utf_convert( $mixed ) {
    if (is_array($mixed)) {
        foreach ($mixed as $key => $value) {
            $mixed[$key] = utf8ize($value);
        }
    } elseif (is_string($mixed)) {
        return mb_convert_encoding($mixed, "UTF-8", "UTF-8");
    }
    return $mixed;
}

다른 사용자에게 도움이 될 수 있습니다.NULL 값이 있는 경우 json 문자열을 체크 인합니다.NULL 값이 있는 경우 json_decode는 작동하지 않습니다.

이 슈퍼 베이직 기능이 도움이 될 수 있습니다.나중에 추가가 필요할 경우를 대비해 어레이에 NULL을 만들었습니다.

function jsonValueFix($json){
    $json = str_replace( array('NULL'),'""',$json );
    return $json;
}

json_decod를 두 번 사용했는데 효과가 있었어요.

$response = json_decode($apiResponse, true);
$response = json_decode($response, true);

언급URL : https://stackoverflow.com/questions/24001410/php-json-decode-not-working