550 Stimmen

Der schnellste Weg, um zu überprüfen, ob eine Zeichenfolge JSON in PHP ist?

Ich brauche eine wirklich, wirklich schnelle Methode der Überprüfung, ob eine Zeichenfolge JSON ist oder nicht. Ich fühle mich wie dies ist nicht der beste Weg:

function isJson($string) {
    return ((is_string($string) &&
            (is_object(json_decode($string)) ||
            is_array(json_decode($string))))) ? true : false;
}

Gibt es da draußen Leistungsenthusiasten, die diese Methode verbessern wollen?

2voto

Jack Punkte 164

Hallo hier ist ein kleiner Schnipsel aus meiner Bibliothek, in dieser ersten Bedingung bin ich nur überprüfen, wenn die Daten json dann zurückgeben, wenn korrekt dekodiert, beachten Sie bitte die substr-Verwendung für Leistung (ich habe noch nicht gesehen, jede json-Datei nicht beginnen weder durch { oder [

$input=trim($input);
if ((substr($input, 0, 1) == '{' && substr($input, -1) == '}') or (substr($input, 0, 1) == '[' && substr($input, -1) == ']')) {
    $output = json_decode($input, 1);
    if (in_array(gettype($output),['object','array'])) {
        #then it's definitely JSON
    }
}

1voto

jcmargentina Punkte 51

ZU IHRER INFORMATION:

Ich arbeite an einem RFC, um eine neue Funktion in php hinzuzufügen, die in der Lage ist, nur einen json-string zu validieren, ohne dabei ein Objekt/Array zu erzeugen.

Warum eine reine Validierungsfunktion? Weil json_decode() ein Array/Objekt beim Parsen des Json-Zeichensatzes erstellt, was sich auf die Menge des verwendeten Speichers auswirkt; das bedeutet, dass beim Validieren eines Json-Zeichensatzes die maximale Speichergrenze erreicht werden kann.

Um Ihnen eine Vorstellung zu geben, überprüfen Sie diesen Code performance_test_json_validate()_vs_json_decode() :

In diesem Test können wir sehen, dass die neue Funktion json_validate() 0 MB für die Validierung der json-Zeichenfolge verwendet, während json_decode() benötigte dafür 109 MB (weil beim Parsen ein Array/Objekt im Speicher erstellt wird).

Das ist im Moment noch Work In Progress, aber ich poste das, weil mich Ihre Meinung dazu interessiert (nicht, ob Sie denken, dass es sich lohnt, es zu haben oder nicht, ich meine, aus technischer Sicht).

Github: https://github.com/php/php-src/pull/9399

RFC (Arbeit in Arbeit): https://wiki.php.net/rfc/json_validate

Ich freue mich auf Ihre Meinung/Unterstützung zu diesem Thema.

Vielen Dank im Voraus.

1voto

milad Punkte 121
function isJson($string) {
    $obj = json_decode($string);
    return json_last_error() === JSON_ERROR_NONE && gettype($obj ) == "object";
}

dies funktioniert und liefert nicht true für Zahlen

neues Update

Die obige Lösung hat keine gute Leistung, wenn das JSON lang ist und Sie $obj nicht verwenden müssen

wenn Sie nur prüfen wollen, ist es besser, die folgende Funktion zu verwenden

function isJson($string) {
    if(is_numeric($string)) return false;
    json_decode($string);
    return json_last_error() === JSON_ERROR_NONE;
}

1voto

maxpower9000 Punkte 223

Ich weiß nicht, wie es um die Leistung oder die Eleganz meiner Lösung bestellt ist, aber das ist es, was ich verwende:

if (preg_match('/^[\[\{]\"/', $string)) {
    $aJson = json_decode($string, true);
    if (!is_null($aJson)) {
       ... do stuff here ...
    }
}

Da alle meine JSON-kodierten Zeichenfolgen mit {" beginnen, reicht es aus, dies mit einem RegEx zu testen. Ich bin überhaupt nicht fließend mit RegEx, so dass es eine bessere Möglichkeit, dies zu tun sein könnte. Auch: strpos() könnte schneller sein.

Ich versuche nur, meinen Senf dazuzugeben.

P.S. Ich habe gerade die RegEx-Zeichenkette auf /^[\[\{]\"/ um auch JSON-Array-Zeichenfolgen zu finden. Es wird nun also entweder nach [" oder {" am Anfang der Zeichenfolge gesucht.

0voto

kalicki2k Punkte 490

Eine weitere Anregung von mir :)

function isJson(string $string) {
  return ($result = json_decode($string, true)) ? $result : $string;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X