programing

PHP json_decode()는 유효한 것처럼 보이는 JSON을 사용하여 NULL을 반환합니까?

goodcopy 2023. 3. 19. 21:07
반응형

PHP json_decode()는 유효한 것처럼 보이는 JSON을 사용하여 NULL을 반환합니까?

플레인 텍스트파일에 저장되어 있는 JSON 오브젝트는 다음과 같습니다.

{
    "MySQL": {
        "Server": "(server)",
        "Username": "(user)",
        "Password": "(pwd)",
        "DatabaseName": "(dbname)"
    },
    "Ftp": {
        "Server": "(server)",
        "Username": "(user)",
        "Password": "(pwd)",
        "RootFolder": "(rf)"
    },
    "BasePath": "../../bin/",
    "NotesAppPath": "notas",
    "SearchAppPath": "buscar",
    "BaseUrl": "http:\/\/montemaiztusitio.com.ar",
    "InitialExtensions": [
        "nem.mysqlhandler",
        "nem.string",
        "nem.colour",
        "nem.filesystem",
        "nem.rss",
        "nem.date",
        "nem.template",
        "nem.media",
        "nem.measuring",
        "nem.weather",
        "nem.currency"
    ],
    "MediaPath": "media",
    "MediaGalleriesTable": "journal_media_galleries",
    "MediaTable": "journal_media",
    "Journal": {
        "AllowedAdFileFormats": [
            "flv:1",
            "jpg:2",
            "gif:3",
            "png:4",
            "swf:5"
        ],
        "AdColumnId": "3",
        "RSSLinkFormat": "%DOMAIN%\/notas\/%YEAR%-%MONTH%-%DAY%\/%TITLE%/",
        "FrontendLayout": "Flat",
        "AdPath": "ad",
        "SiteTitle": "Monte Maíz: Tu Sitio",
        "GlobalSiteDescription": "Periódico local de Monte Maíz.",
        "MoreInfoAt": "Más información aquí, en el Periódico local de Monte Maíz.",
        "TemplatePath": "templates",
        "WeatherSource": "accuweather:SAM|AR|AR005|MONTE MAIZ",
        "WeatherMeasureType": "1",
        "CurrencySource": "cotizacion-monedas:Dolar|Euro|Real",
        "TimesSingular": "vez",
        "TimesPlural": "veces"
    }
}

it it it it it it로 하면json_decode() NULL?은 읽을 수 ).file_get_contents()정상적으로 동작했습니다).

JSON을 http://jsonlint.com/에 대해 테스트했는데, 완벽하게 유효합니다.

여기 무슨 일 있어?

이건 내게 효과가 있었다.

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

특수문자의 인코딩일 수 있습니다.json_last_error()에게 확실한 정보를 얻을 수 있습니다.

한번 써보세요.

json_decode(stripslashes($_POST['data']))

Chrome에서 요청을 체크하면 JSON이 텍스트임을 알 수 있으므로 공백 코드가 JSON에 추가되었습니다.

를 사용하여 클리어 할 수 있습니다.

$k=preg_replace('/\s+/', '',$k);

다음으로 다음을 사용할 수 있습니다.

json_decode($k)

print_r그러면 배열이 표시됩니다.

숨겨진 캐릭터들이 당신의 아들을 괴롭히고 있을지도 모릅니다.이걸 시도해 보세요.

$json = utf8_encode($yourString);
$data = json_decode($json);

저도 같은 문제가 있어서 디코딩하기 전에 인용문자를 교체해서 간단히 해결했습니다.

$json = str_replace('"', '"', $json);
$object = json_decode($json);

JSON 값은 JSON.stringify 함수에 의해 생성되었습니다.

javascript에서 json을 수신하면 php 함수가 stripslashes() 동작합니다.python에서 json을 수신하면 배열이 연관성이 있기 때문에 json_decode 호출에 대한 두 번째 옵션 파라미터가 기능을 수행합니다.나한테는 아주 잘 먹혀.

$json = stripslashes($json); //add this line if json from javascript
$edit = json_decode($json, true); //adding parameter true if json from python

이 오류는 JSON 문자열이 유효하지 않음을 의미합니다.

오류가 발생하여 PHP가 실패 이유를 포함하여 예외를 슬로우할 때 예외를 슬로우합니다.

사용방법:

$json = json_decode($string, null, 512, JSON_THROW_ON_ERROR);

이것은 에러의 종류를 이해하는 데 도움이 됩니다.

<?php
// A valid json string
$json[] = '{"Organization": "PHP Documentation Team"}';

// An invalid json string which will cause an syntax 
// error, in this case we used ' instead of " for quotation
$json[] = "{'Organization': 'PHP Documentation Team'}";


foreach ($json as $string) {
    echo 'Decoding: ' . $string;
    json_decode($string);

    switch (json_last_error()) {
        case JSON_ERROR_NONE:
            echo ' - No errors';
        break;
        case JSON_ERROR_DEPTH:
            echo ' - Maximum stack depth exceeded';
        break;
        case JSON_ERROR_STATE_MISMATCH:
            echo ' - Underflow or the modes mismatch';
        break;
        case JSON_ERROR_CTRL_CHAR:
            echo ' - Unexpected control character found';
        break;
        case JSON_ERROR_SYNTAX:
            echo ' - Syntax error, malformed JSON';
        break;
        case JSON_ERROR_UTF8:
            echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
        break;
        default:
            echo ' - Unknown error';
        break;
    }

    echo PHP_EOL;
}
?>

오늘 이 문제에 부딪혔기 때문에 추가하려고 합니다.JSON 문자열을 둘러싼 문자열 패딩이 있는 경우 json_decode는 NULL을 반환합니다.

PHP 변수 이외의 소스에서 JSON을 풀하는 경우 먼저 "트림"하는 것이 현명합니다.

$jsonData = trim($jsonData);

JSON 데이터에서 유효한 NULL 결과를 얻을 때 가장 중요한 것은 다음 명령을 사용하는 것입니다.

json_last_error_msg();

이.

var_dump(json_last_error_msg());
string(53) "Control character error, possibly incorrectly encoded"

다음으로 이 문제를 해결합니다.

$new_json = preg_replace('/[[:cntrl:]]/', '', $json);

제 https://stackoverflow.com/questions/17219916/64923728 를 해결한 방법은 다음과 같습니다.JSON 파일은 UTF-8 Encoding이어야 합니다.저는 UTF-8에 BOM이 있는 경우입니다.JSON 문자열 출력에 65279가 추가되어 있습니다.json_decode()로 하다

제 경우, 같은 문제에 직면해 있었습니다만, 이것은 json 문자열 내부의 슬래시에 의해 발생했기 때문에,

json_decode(stripslashes($YourJsonString))

또는

json_decode( preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $YourJsonString), true );

상기가 동작하지 않는 경우는, 우선 html quote의 따옴표를 치환해 주세요.javascript에서 php로 데이터를 송신하고 있는 경우일 수 있습니다.

    $YourJsonString = stripslashes($YourJsonString);
    $YourJsonString = str_replace('&quot;', '"', $YourJsonString);
    $YourJsonString = str_replace('["', '[', $YourJsonString);
    $YourJsonString = str_replace('"]', ']', $YourJsonString);
    $YourJsonString = str_replace('"{', '{', $YourJsonString);
    $YourJsonString = str_replace('}"', '}', $YourJsonString);
    $YourJsonObject = json_decode($YourJsonString);

해결할 수 있을 거야

아마 다른 사람들이 말한 것처럼 BOM일 거예요.다음과 같이 시험해 보십시오.

    // BOM (Byte Order Mark) issue, needs removing to decode
    $bom = pack('H*','EFBBBF');
    $response = preg_replace("/^$bom/", '', $response);
    unset($tmp_bom);
    $response = json_decode($response);

이는 Authorize와 같은 일부 SDK에서 알려진 버그입니다.그물

데이터베이스에서 json을 가져오려면

mysqli_set_charset($con, "utf8");

접속 링크 $con을 정의한 후

딱 한 번만 아껴요.3시간 동안 html 인코딩 문제라는 것을 알게 되었습니다.이거 드셔보세요

if(get_magic_quotes_gpc()){
   $param = stripslashes($row['your column name']);
}else{
  $param = $row['your column name'];
}

$param = json_decode(html_entity_decode($param),true);
$json_errors = array(
JSON_ERROR_NONE => 'No error has occurred',
JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded',
JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
JSON_ERROR_SYNTAX => 'Syntax error',
);
echo 'Last error : ', $json_errors[json_last_error()], PHP_EOL, PHP_EOL;
print_r($param);

html_entity_decode()가 작동했습니다.이거 드셔보세요.

$input = file_get_contents("php://input");
$input = html_entity_decode($input);
$event_json = json_decode($input,true);

알아내는 데 1시간 정도 걸렸지만 (JavaScript에서 작동하는) 쉼표가 PHP에서 실패합니다.
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

str_replace([PHP_EOL, ",}"], ["", "}"], $JSON);

.json 파일(예: config.json)을 작성할 것을 권장합니다.그런 다음 모든 json 개체를 붙여넣고 포맷합니다.따라서 json 오브젝트를 망가뜨리는 모든 것을 제거하고 깨끗한 복사 붙여넣기 json 오브젝트를 얻을 수 있습니다.

  • 나도 같은 문제에 직면해 있어
  • 다음 단계를 수정합니다.1) 브라우저에서 해당 변수를 인쇄 2) 프리포맷터로 변수 데이터 검증 3) 추가 처리 시 해당 데이터 복사/참조
  • 그 후로는 아무 문제가 없었어요

이 문제는 값 또는 키에 ('' insted {")를 사용했기 때문에 발생합니다.

여기 잘못된 형식이 있습니다.

{'name':'ichsan'}

디코딩하면 NULL이 반환됩니다.

당신은 json 요청을 이렇게 전달해야 합니다.

{"name":"ichsan"}

JSON을 인쇄하고 페이지 소스(CTRL/CMD+U):

print_r(file_get_contents($url));

.<pre>붙이다

이러한 점을 확인해야 합니다.

1. json 문자열에 알 수 없는 문자가 없습니다.

2. json 문자열은 온라인 json 뷰어에서 볼 수 있습니다(구글에서 온라인 뷰어 또는 json 파서로 검색 가능). 오류 없이 볼 수 있습니다.

3. 문자열에는 html 엔티티가 없습니다.일반 텍스트/문자열이어야 합니다.

포인트 3의 설명을 위해서

$html_product_sizes_json=htmlentities($html);
    $ProductSizesArr = json_decode($html_product_sizes_json,true);

(htmlentities() 함수를 삭제합니다)

$html_product_sizes_json=$html;
    $ProductSizesArr = json_decode($html_product_sizes_json,true);

제 경우 JSON 문자열의 작은 따옴표 때문입니다.

JSON 형식에서는 키와 문자열 값의 큰따옴표만 사용할 수 있습니다.

예:

$jsonString = '{\'hello\': \'PHP\'}'; // valid value should be '{"hello": "PHP"}'
$json = json_decode($jsonString);
print $json; // null

Javascript 구문 때문에 헷갈렸습니다.물론 Javascript에서는 다음과 같이 할 수 있습니다.

let json = {
    hello: 'PHP' // no quote for key, single quote for string value
}

// OR:
json = {
    'hello': 'PHP' // single quote for key and value
}

그러나 나중에 이러한 오브젝트를 JSON 문자열로 변환할 경우:

JSON.stringify(json); // "{"hello":"PHP"}"

PHP 관련 솔루션을 적용하기 전에 JSON 형식을 확인하십시오.아마 그게 문제일 거야.이 온라인 JSON 형식 검증 프로그램을 사용해 보십시오.

저는 json_decode()를 올바르게 동작시키기 위해 error_reporting을 꺼야 했습니다.이상하게 들리지만, 제 경우에는 사실이에요.디코딩하려는 JSON 문자열 사이에 알림이 인쇄되어 있기 때문입니다.

나도 똑같은 문제가 있었는데 이 코드로 해결되었다.

$zip = file_get_contents($file);
$zip = json_decode(stripslashes($zip), true);

저도 같은 문제가 있었는데 어떤 답변도 도움이 되지 않았습니다.JSON 객체의 변수 중 하나에 값이 있습니다.Andaman & Nicobar이걸 지웠어요.&내 코드는 완벽하게 작동했어

<?php 
$json_url = "http://api.testmagazine.com/test.php?type=menu";
$json = file_get_contents($json_url);
$json=str_replace('},

]',"}

]",$json);
$data = json_decode($json);

echo "<pre>";
print_r($data);
echo "</pre>";
?>

언급URL : https://stackoverflow.com/questions/2410342/php-json-decode-returns-null-with-seemingly-valid-json

반응형