Ich brauche eine sehr, sehr schnelle Methode, um zu überprüfen, ob eine Zeichenfolge JSON ist oder nicht. Ich denke, das ist nicht der beste Weg:
function isJson($string) {
return ((is_string($string) &&
(is_object(json_decode($string)) ||
is_array(json_decode($string))))) ? true : false;
}
Möchten Performance-Enthusiasten diese Methode verbessern?
php
json
error-handling
json-deserialization
jsonresult
Kirk Ouimet
quelle
quelle
json_decode
einmal zu verwenden ... Überprüfen Sie auch die Eingabe- und Rückgabewerte vonjson_decode
.Antworten:
quelle
{
,[
oder erstes Symbol einer anderen wörtlichen kann potenziell beschleunigen stark diese ein, wenn viele der eingehenden Strings erwarten nicht-JSON zu sein.6.5 = true, '300' = true, 9 = true
usw. Dies ist möglicherweise ein gültiger JSON-Wert, aber die Funktion verhält sich möglicherweise nicht wie erwartet, wenn Sie nur nach gültigen JSON-Zeichenfolgen mit{}
oder suchen möchten[]
.Die Funktion
json_last_error
gibt den letzten Fehler zurück, der während der JSON-Codierung und -Decodierung aufgetreten ist. Der schnellste Weg, um den gültigen JSON zu überprüfen, istBeachten Sie, dass
json_last_error
dies nur in PHP> = 5.3.0 unterstützt wird.Es ist immer gut, den genauen Fehler während der Entwicklungszeit zu kennen. Hier ist ein vollständiges Programm, um den genauen Fehler basierend auf PHP-Dokumenten zu überprüfen.
Da
json_last_error
dies in PHP 5.2 nicht unterstützt wird, können Sie überprüfen, ob die Codierung oder Decodierung boolesch istFALSE
. Hier ist ein BeispielHoffe das ist hilfreich. Viel Spaß beim Codieren!
quelle
((strlen($json) === 5) && ($json !== 'false'))
sollte auch eine Überprüfung durchgeführt werden, um diese Kante zu vermeiden.json_last_error
zurückgegebenJSON_ERROR_NONE
.Alles was Sie wirklich tun müssen ist dies ...
Diese Anfrage erfordert nicht einmal eine separate Funktion. Wickeln Sie einfach is_object um json_decode und fahren Sie fort. Anscheinend haben die Leute bei dieser Lösung viel zu viel darüber nachgedacht.
quelle
is_array
zusätzlich zu verwendenis_object
, andernfallsis_object
wird false für einfache Arrays zurückgegeben, die als JSON codiert sind. Also @ggutenberg ist in diesem Fall richtig. Wenn Sie das Argument true an übergebenjson_decode
, wird die Rückgabe eines Objekts als Array erzwungen. Sie könnten theoretisch immer die Dekodierung in ein Array erzwingen und nur überprüfenis_array
, ob dies funktionieren sollte.json_encode($array)
für einfaches PHP-Array, und dann werde ichjson_decode($str)
Objekt erhalten, aber kein Array.json_decode($str, true)
zwingt zur Umwandlung in ein Array. Warum komplizierte Zeichenfolge in Ihrem Code? Suchen Sie nachis_array(json_decode($str, true))
und einige Zeit später, wenn Sie es lesen, werden Sie verstehen, dass dekodiert nur ein Array sein darf. Viel schwerer zu erratenis_object(json_decode($MyJSONArray))
"Oh, hier überprüfe ich, ob ein Array dekodiert ist oder nicht?"json_decode
die Rückgabe eines Arrays erzwingen , um zu sparen, dass Sie nach Objekten und Arrays suchen , aber wenn Sie dies nicht tun UND Siejson_decode
was War zunächst ein einfaches Array, erhalten Sie beim Decodieren ein Array, kein Objekt. Sie müssen verwenden,JSON_FORCE_OBJECT
wenn Sie ein Objekt immer für die Codierung erzwingen möchten, wenn ein einfaches Array übergeben wird.This request does not require a separate function even
. Genau genommen erfordert keine Lösung eine separate Funktion. Der Sinn einer Funktion besteht nicht darin, mehrere Codezeilen wie eine Codezeile aussehen zu lassen. Der Zweck der Funktion besteht darin, den JSON-Überprüfungsprozess überall in Ihrer Anwendung zum Standard zu machen, damit verschiedene Programmierer (oder derselbe Programmierer im Laufe der Zeit) in verschiedenen Phasen des Programmablaufs keine unterschiedlichen Überprüfungsverfahren verwenden.Mit
json_decode
"prüfen" ist dies möglicherweise nicht der schnellste Weg. Wenn es sich um eine tief verschachtelte Struktur handelt, ist es eine Verschwendung von Speicher und Zeit, viele Objekte von Arrays zu instanziieren, um sie einfach wegzuwerfen.So ist es schneller sein könnte , zu verwenden
preg_match
und der RFC4627 regex auch Gültigkeit zu gewährleisten :Das gleiche in PHP:
Nicht genug von einem Performance-Enthusiasten, um sich hier mit Benchmarks zu beschäftigen.
quelle
json_decode
immer schneller sind als ein PCRE- regulärer Ausdruck . (Obwohl es nicht sehr optimiert ist, wurden keine synthetischen Tests gefunden und es könnte sich in Perl anders verhalten.)\r
\n
\t
es macht nur Sinn, damit PHP sie nicht interpoliert, sondern von PCRE interpretieren lässt (nur für den/x
Modus erforderlich ). Die anderen Vorkommnisse brauchen es nicht unbedingt; Dennoch "entgeht der Backslash sich selbst" in allen String-PHP-Kontexten. Man könnte es also genauer betrachten.Dies gibt true zurück, wenn Ihre Zeichenfolge ein JSON-Array oder -Objekt darstellt :
Es lehnt JSON-Zeichenfolgen ab, die nur eine Zahl, eine Zeichenfolge oder einen Booleschen Wert enthalten, obwohl diese Zeichenfolgen technisch gültige JSON-Zeichenfolgen sind.
Es ist der kürzeste Weg, den ich finden kann.
quelle
var_dump(isJson('[]')); // bool(false)
. Laut der Dokumentation zu Booleschen Werten bewertet PHP Arrays mit Nullelementen als falsch. Hier ist eine geringfügige Änderung zur Anpassung der Rückgabeerklärung. es führt einen identischen Vergleich mit der decodierten Ausgabe durch, die diesen Fall behandelt:return $json !== false && $str != $json;
isJson('hello')
true, was nicht gültig ist. Hier wird absichtlich ein loser Vergleich gewählt. Ich habe keine schnelle Lösung für die leere Array- / Objektsituation, außer einer hässlichenreturn $json == '[]' || ...
Der einfachste und schnellste Weg, den ich benutze, ist der folgende;
Dies liegt daran, dass json_decode () NULL zurückgibt, wenn die eingegebene Zeichenfolge nicht json oder ungültiger json ist.
Einfache Funktion zum Validieren von JSON
Wenn Sie Ihren JSON an mehreren Stellen validieren müssen, können Sie immer die folgende Funktion verwenden.
In der obigen Funktion erhalten Sie im Gegenzug true, wenn es sich um einen gültigen JSON handelt.
quelle
json_decode('null') == NULL
undnull
ist ein gültiger JSON-Wert.JSON.parse('null')
in Ihrer Entwicklungskonsole versuchen .http://tr.php.net/manual/en/function.json-decode.php Der Rückgabewert ist null, wenn eine ungültige Codierung festgestellt wird.
quelle
json_decode($str)!=null;
oder sonst sollte die Funktion aufgerufen werdenis_not_json
.json_decode('null')
ist gemäß der Spezifikation JSON gültig und sollte den Wert von zurückgebennull
.is_json('false')
undis_json('[]')
Rückgabefalse
als Typ nicht aktiviert ist. Ich denke, diese Methode sollte eher zurückkehren$str === null || json_decode($str) !== null
.Sie müssen Ihre Eingabe überprüfen, um sicherzustellen, dass die übergebene Zeichenfolge nicht leer und tatsächlich eine Zeichenfolge ist. Eine leere Zeichenfolge ist kein gültiger JSON.
Ich denke , in PHP es wichtiger ist , zu bestimmen , ob das JSON - Objekt selbst hat Daten, da die Daten zu nutzen , müssen Sie anrufen
json_encode()
oderjson_decode()
. Ich schlage vor, leere JSON-Objekte zu verweigern, damit Sie nicht unnötig Codierungen und Decodierungen für leere Daten ausführen.quelle
'0'
ist nicht gültig json ... warum sollte ich vorsichtig sein? @ KzqaiDies wird es tun:
json_last_error()
Gibt, wie in anderen Antworten gezeigt, alle Fehler von unserem letzten json_decode () zurück. Es gibt jedoch einige Edge-Anwendungsfälle, in denen diese Funktion allein nicht umfassend genug ist. Wenn Sie beispielsweisejson_decode()
eine Ganzzahl (z. B. :)123
oder eine Folge von Zahlen ohne Leerzeichen oder andere Zeichen (z. B. :) verwenden"123"
, wird diejson_last_error()
Funktion keinen Fehler abfangen.Um dem entgegenzuwirken, habe ich einen zusätzlichen Schritt hinzugefügt, der sicherstellt, dass das Ergebnis
json_decode()
entweder ein Objekt oder ein Array ist. Wenn nicht, kehren wir zurückfalse
.Überprüfen Sie diese beiden Beispiele, um dies in Aktion zu sehen:
json_last_error()
quelle
"hello"
ist ein gültiger JSON, und es ist weder ein Objekt noch ein Array,json_last_error()
ist genugjson_last_error()
Gibt einen Fehlercode zurück,4
wenn Siejson_decode()
die Zeichenfolge eingeben"hello"
. Beispiel hier: 3v4l.org/lSsEohello
ist kein gültiger JSON, aber"hello"
ist 3v4l.org/OEJrQEinfache Methode ist es, das JSON-Ergebnis zu überprüfen.
quelle
in GuzzleHttp :
quelle
Früher habe ich nur nach einem Nullwert gesucht, was eigentlich falsch war.
Der obige Code funktioniert gut mit Zeichenfolgen. Sobald ich jedoch eine Nummer gebe, löst sie sich auf. Zum Beispiel.
Es war sehr einfach, das zu reparieren, was ich getan habe.
quelle
quelle
Ein anderer einfacher Weg
quelle
json_decode($str,true)
Objekte in Arrays konvertiert, sodass die Prüfung is_array bestanden wird. Sie korrigieren jedoch Zeichenfolgen, Ganzzahlen usw.Wir müssen überprüfen, ob die übergebene Zeichenfolge nicht numerisch ist, da in diesem Fall json_decode keinen Fehler auslöst.
quelle
Ich habe diese Frage gefunden, nachdem ich gestern in meiner Arbeit auf etwas Ähnliches gestoßen bin. Meine Lösung war am Ende eine Mischung aus einigen der oben genannten Ansätze:
quelle
Ich habe einige dieser Lösungen ausprobiert, aber nichts hat für mich funktioniert. Ich versuche diese einfache Sache:
Ich denke, es ist eine gute Lösung, da JSON-Dekodierung ohne den zweiten Parameter ein Objekt ergibt.
BEARBEITEN: Wenn Sie wissen, was die Eingabe sein wird, können Sie diesen Code an Ihre Bedürfnisse anpassen. In meinem Fall weiß ich, dass ich einen Json habe, der mit "{" beginnt, daher muss ich nicht überprüfen, ob es sich um ein Array handelt.
quelle
Unter Verwendung von PHPBench mit der folgenden Klasse wurden die folgenden Ergebnisse erzielt:
Fazit: Der schnellste Weg, um zu überprüfen, ob json gültig ist, ist die Rückkehr
json_decode($json, true) !== null)
.quelle
Ich weiß nichts über die Leistung oder Eleganz meiner Lösung, aber ich verwende Folgendes:
Da alle meine JSON-codierten Zeichenfolgen mit {"beginnen, reicht es aus, dies mit einem RegEx zu testen. Ich spreche überhaupt nicht fließend mit RegEx, daher gibt es möglicherweise einen besseren Weg, dies zu tun. Außerdem: strpos () ist möglicherweise schneller.
Ich versuche nur, meine Tuppence wert zu geben.
PS Gerade die RegEx-Zeichenfolge aktualisiert,
/^[\[\{]\"/
um auch JSON-Array-Zeichenfolgen zu finden. Daher wird am Anfang des Strings entweder nach ["oder {" gesucht.quelle
Sollte so etwas sein:
Gerätetest
quelle
ErrorException
ob die Zeichenfolge ein Array oder ein Objekt ist.Erweitern dieser Antwort Wie wäre es mit Folgendem:
quelle
Hallo, hier ist ein kleiner Ausschnitt aus meiner Bibliothek. In diesem ersten Zustand überprüfe ich nur, ob die Daten json sind, und gebe sie dann zurück, wenn sie korrekt dekodiert sind. Bitte beachten Sie die Substr-Verwendung für die Leistung (ich habe noch keine json-Datei gesehen, die auch nicht beginnt von {oder [
quelle
Ein weiterer Vorschlag von mir :)
quelle
Die benutzerdefinierte Funktion
Fälle
Ressourcen
https://gist.github.com/rafasashi/93d06bae83cc1a1f440b
quelle
Frisch erstellte Funktion für PHP 5.2-Kompatibilität, wenn Sie die dekodierten Daten für den Erfolg benötigen:
Verwendungszweck:
Einige Tests:
quelle
quelle
Eine einfache Modifikation von Henriks Antwort, um die meisten erforderlichen Möglichkeiten zu berühren.
(einschließlich "{} und []")
quelle
Der schnellste Weg , um vielleicht zu entschlüsseln ein mögliche JSON - Objekt an einem PHP - Objekt / Array:
quelle
Hier ist eine performante und einfache Funktion, die ich erstellt habe (die die grundlegende Zeichenfolgenüberprüfung verwendet, bevor sie
json_decode
für größere Zeichenfolgen verwendet wird):quelle