Vraag Detecteer slechte json-gegevens in PHP json_decode ()?


Ik probeer slechte json-gegevens af te handelen wanneer deze worden geanalyseerd via json_decode (). Ik gebruik het volgende script:

if(!json_decode($_POST)) {
  echo "bad json data!";
  exit;
}

Als $ _POST gelijk is aan:

'{ bar: "baz" }'

Dan behandelt json_decode de fout goed en spuugt "bad json data!"; Nochtans, als ik $ _POST aan zoiets als "ongeldige gegevens" plaats, geeft het me:

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!

Moet ik een aangepast script schrijven om geldige json-gegevens te detecteren, of is er een andere handige manier om dit te detecteren?


36
2018-02-27 16:55


oorsprong


antwoorden:


Hier zijn een paar dingen over json_decode :

  • het geeft de gegevens terug, of null wanneer er een fout is
  • het kan ook terugkeren null wanneer er geen fout is: wanneer de JSON-string bevat null
  • het roept een waarschuwing op wanneer er een waarschuwing is - een waarschuwing dat je wilt laten verdwijnen.


Om het waarschuwingsprobleem op te lossen, zou een oplossing zijn om de @ operator  (Ik raad het niet vaak aan om het te gebruiken, omdat het het debuggen een stuk moeilijker maakt ... Maar hier is er niet veel keus) :

$_POST = array(
    'bad data'
);
$data = @json_decode($_POST);

Je zou dan moeten testen of $data is null - en om het geval te vermijden waarin json_decode komt terug null voor null in de JSON-reeks kunt u controleren json_last_error, welke (Citaat) :

Retourneert de laatste fout (indien aanwezig)   opgetreden bij de laatste JSON-analyse.


Dat betekent dat je een code als de volgende zou moeten gebruiken:

if ($data === null
    && json_last_error() !== JSON_ERROR_NONE) {
    echo "incorrect data";
}

85
2018-02-27 17:01



Je kunt ook json_last_error gebruiken: http://php.net/manual/en/function.json-last-error.php

wat als documentatie zegt:

Retourneert de laatste fout (indien aanwezig) die is opgetreden tijdens de laatste JSON   encoding / decoding.

Hier is een voorbeeld

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;
}

11
2017-07-30 15:31



Dit is hoe Guzzle omgaat met 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;
}

3
2018-06-09 03:41



Ik brak gewoon mijn hoofd over een json-syntaxisfout in wat een perfecte json leek te zijn: {"test1": "car", "test2": "auto"} van een url-gecodeerde string.

Maar in mijn geval was een deel van het bovenstaande html gecodeerd, als toevoeging html_entity_decode($string) deed het.

$ft = json_decode(html_entity_decode(urldecode(filter_input(INPUT_GET, 'ft', FILTER_SANITIZE_STRING))));

Hopelijk zal dit iemand anders wat tijd besparen.


1
2017-08-21 02:01



/ **      *      * aangepaste json_decode      * Json_decode fouten verwerken      *      * @param type $ json_text      * @return-type      * /     openbare statische functie 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'
            );
    }
}

1
2017-09-18 17:21