PHP json_decode()에서 잘못된 json 데이터를 감지하시겠습니까?
json_decode()를 해석할 때 부정한 json 데이터를 처리하려고 합니다.다음 스크립트를 사용하고 있습니다.
if(!json_decode($_POST)) {
echo "bad json data!";
exit;
}
$_POST가 동일한 경우:
'{ bar: "baz" }'
그런 다음 json_decode는 오류를 정상적으로 처리하고 "bad json data!"를 내뱉습니다.그러나 $_POST를 "유효하지 않은 데이터"와 같은 것으로 설정하면 다음과 같은 결과가 나타납니다.
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!
유효한 json 데이터를 검출하기 위해 커스텀스크립트를 작성해야 합니까?아니면 이것을 검출할 수 있는 다른 좋은 방법이 있나요?
다음은 에 관한 몇 가지 사항입니다.
- 데이터를 반환합니다.
null
오류가 있을 때 - 그것은 또한 돌아올 수 있다.
null
오류가 없는 경우: JSON 문자열에 포함된 경우null
- 경고 - 사라지게 하려는 경고가 있을 경우 경고가 발생합니다.
경고 문제를 해결하려면 연산자를 사용하는 것이 좋습니다(디버깅이 더 어려워지기 때문에 자주 사용하지 않습니다). 그러나 여기서는 선택의 여지가 많지 않습니다.
$_POST = array(
'bad data'
);
$data = @json_decode($_POST);
그런 다음 테스트해야 합니다.$data
이null
--그리고, 다음의 경우를 피하기 위해서.json_decode
돌아온다null
위해서null
JSON 문자열에서는 다음 항목을 체크할 수 있습니다(따옴표).
마지막 JSON 해석에 의해 발생한 마지막 오류(있는 경우)를 반환합니다.
즉, 다음과 같은 코드를 사용해야 합니다.
if ($data === null
&& json_last_error() !== JSON_ERROR_NONE) {
echo "incorrect data";
}
PHP 7.3 이후 json_decode 함수는 새로운 JSON_THROW_ON_ERROR 옵션을 받아들이며, 이를 통해 json_decode는 오류 시 null을 반환하지 않고 예외를 슬로우합니다.
예:
try {
json_decode("{", false, 512, JSON_THROW_ON_ERROR);
}
catch (\JsonException $exception) {
echo $exception->getMessage(); // displays "Syntax error"
}
json_last_error 를 사용할 수도 있습니다.http://php.net/manual/en/function.json-last-error.php
문서에는 다음과 같이 기재되어 있습니다.
마지막 JSON 인코딩/디코딩 중에 발생한 마지막 오류(있는 경우)를 반환합니다.
여기 예가 있다
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;
}
구즐은 이렇게 json을 처리한다.
/**
* Parse the JSON response body and return an array
*
* @return array|string|int|bool|float
* @throws RuntimeException if the response body is not in JSON format
*/
public function json()
{
$data = json_decode((string) $this->body, true);
if (JSON_ERROR_NONE !== json_last_error()) {
throw new RuntimeException('Unable to parse response body into JSON: ' . json_last_error());
}
return $data === null ? array() : $data;
}
완벽한 json으로 보이는 json 구문 오류로 인해 머리가 깨졌습니다.{"test1":"car", "test2":"auto"}
url 부호화 문자열에서 가져옵니다.
하지만 제 경우 위의 몇 가지는 html 인코딩되어 있습니다.html_entity_decode($string)
성공했어.
$ft = json_decode(html_entity_decode(urldecode(filter_input(INPUT_GET, 'ft', FILTER_SANITIZE_STRING))));
이걸로 다른 사람이 시간을 절약할 수 있길 바라.
이 페이지에 있는 모든 가능한 해결책을 한 시간 동안 검토했습니다.가능한 모든 솔루션을 하나의 기능으로 통합하여 보다 빠르고 쉽게 디버깅할 수 있도록 했습니다.
다른 사람에게 도움이 됐으면 좋겠어요.
<?php
/**
* Decontaminate text
*
* Primary sources:
* - https://stackoverflow.com/questions/17219916/json-decode-returns-json-error-syntax-but-online-formatter-says-the-json-is-ok
* - https://stackoverflow.com/questions/2348152/detect-bad-json-data-in-php-json-decode
*/
function decontaminate_text(
$text,
$remove_tags = true,
$remove_line_breaks = true,
$remove_BOM = true,
$ensure_utf8_encoding = true,
$ensure_quotes_are_properly_displayed = true,
$decode_html_entities = true
){
if ( '' != $text && is_string( $text ) ) {
$text = preg_replace( '@<(script|style)[^>]*?>.*?</\\1>@si', '', $text );
$text = str_replace(']]>', ']]>', $text);
if( $remove_tags ){
// Which tags to allow (none!)
// $text = strip_tags($text, '<p>,<strong>,<span>,<a>');
$text = strip_tags($text, '');
}
if( $remove_line_breaks ){
$text = preg_replace('/[\r\n\t ]+/', ' ', $text);
$text = trim( $text );
}
if( $remove_BOM ){
// Source: https://stackoverflow.com/a/31594983/1766219
if( 0 === strpos( bin2hex( $text ), 'efbbbf' ) ){
$text = substr( $text, 3 );
}
}
if( $ensure_utf8_encoding ){
// Check if UTF8-encoding
if( utf8_encode( utf8_decode( $text ) ) != $text ){
$text = mb_convert_encoding( $text, 'utf-8', 'utf-8' );
}
}
if( $ensure_quotes_are_properly_displayed ){
$text = str_replace('"', '"', $text);
}
if( $decode_html_entities ){
$text = html_entity_decode( $text );
}
/**
* Other things to try
* - the chr-function: https://stackoverflow.com/a/20845642/1766219
* - stripslashes (THIS ONE BROKE MY JSON DECODING, AFTER IT STARTED WORKING, THOUGH): https://stackoverflow.com/a/28540745/1766219
* - This (improved?) JSON-decoder didn't help me, but it sure looks fancy: https://stackoverflow.com/a/43694325/1766219
*/
}
return $text;
}
// Example use
$text = decontaminate_text( $text );
// $text = decontaminate_text( $text, false ); // Debug attempt 1
// $text = decontaminate_text( $text, false, false ); // Debug attempt 2
// $text = decontaminate_text( $text, false, false, false ); // Debug attempt 3
$decoded_text = json_decode( $text, true );
echo json_last_error_msg() . ' - ' . json_last_error();
?>
여기 https://github.com/zethodderskov/decontaminate-text-in-php/blob/master/decontaminate-text-preparing-it-for-json-decode.php에서 관리하겠습니다.
/**
*
* custom json_decode
* handle json_decode errors
*
* @param type $json_text
* @return type
*/
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'
);
}
}
언급URL : https://stackoverflow.com/questions/2348152/detect-bad-json-data-in-php-json-decode
'programing' 카테고리의 다른 글
Jackson을 사용하여 json으로 바이트 배열 보내기 (0) | 2023.03.14 |
---|---|
AngularJS : 디렉티브에서의 최소화 문제 (0) | 2023.03.14 |
Ajax를 통한 체크아웃 시 Woocommerce 업데이트 배송 방법 (0) | 2023.03.14 |
Java에서 목록을 Json으로 변환하는 방법 (0) | 2023.03.09 |
W3C 인증에 신경을 써야 합니까? (0) | 2023.03.09 |