Potrzebuję naprawdę, bardzo szybkiej metody sprawdzenia, czy ciąg znaków to JSON, czy nie. Wydaje mi się, że nie jest to najlepszy sposób:
function isJson($string) {
return ((is_string($string) &&
(is_object(json_decode($string)) ||
is_array(json_decode($string))))) ? true : false;
}
Jakiś entuzjasta wydajności chce ulepszyć tę metodę?
php
json
error-handling
json-deserialization
jsonresult
Kirk Ouimet
źródło
źródło
json_decode
raz ... sprawdź także wejściowe i zwracane wartościjson_decode
.Odpowiedzi:
źródło
{
,[
lub pierwszego symbolu innego dosłownym potencjalnie może znacznie przyspieszyć ten jeden w górę, kiedy wielu przychodzących ciągów oczekuje się być non-JSON.6.5 = true, '300' = true, 9 = true
itd. Więc może to być poprawna wartość JSON, ale funkcja może nie działać zgodnie z oczekiwaniami, jeśli chcesz sprawdzać tylko poprawne ciągi JSON za pomocą{}
lub[]
;Funkcja
json_last_error
zwraca ostatni błąd, który wystąpił podczas kodowania i dekodowania JSON. Tak więc najszybszym sposobem sprawdzenia poprawnego JSON jestZauważ, że
json_last_error
jest obsługiwany tylko w PHP> = 5.3.0.Zawsze dobrze jest znać dokładny błąd w czasie programowania. Oto pełny program do sprawdzania dokładnego błędu na podstawie dokumentów PHP.
Ponieważ
json_last_error
nie jest obsługiwane w PHP 5.2, możesz sprawdzić, czy kodowanie lub dekodowanie zwraca wartość logicznąFALSE
. Oto przykładMam nadzieję, że to jest pomocne. Happy Coding!
źródło
((strlen($json) === 5) && ($json !== 'false'))
należy również sprawdzić, aby uniknąć tej krawędzi?json_last_error
powracaJSON_ERROR_NONE
.Wszystko, co naprawdę musisz zrobić, to ...
To żądanie nie wymaga nawet oddzielnej funkcji. Wystarczy owinąć is_object wokół json_decode i przejść dalej. Wydaje się, że w tym rozwiązaniu ludzie zbyt wiele się nad tym zastanawiają.
źródło
is_array
dodatkowois_object
, w przeciwnym razieis_object
zwróci false dla prostych tablic zakodowanych jako JSON. Więc @ggutenberg ma rację w tym przypadku. Przekazanie prawdziwego argumentu w celujson_decode
wymuszenia zwrócenia obiektu jako tablicy. Teoretycznie zawsze możesz wymusić dekodowanie do tablicy i po prostu sprawdzićis_array
, czy to powinno zadziałać.json_encode($array)
dla prostej tablicy PHP, a następnie czyjson_decode($str)
otrzymam obiekt, ale nie tablicę.json_decode($str, true)
zmusza do konwersji na tablicę. Dlaczego skomplikowany ciąg w kodzie? Sprawdź,is_array(json_decode($str, true))
a po jakimś czasie po przeczytaniu zrozumiesz, że dekodowany musi być tylko tablicą. Znacznie trudniej zgadnąćis_object(json_decode($MyJSONArray))
„Och, tu sprawdzam, czy dekodowana jest tablica, czy nie?”json_decode
do zwrócenia tablicy, aby oszczędzić ci sprawdzania obiektu i tablicy, ale jeśli nie I OTOjson_decode
co była prosta tablica na początek, w zamian otrzymasz dekodę, a nie obiekt. Musisz użyć,JSON_FORCE_OBJECT
jeśli chcesz zawsze wymuszać kodowanie obiektu JEŚLI przekazując prostą tablicę.This request does not require a separate function even
. Ściśle mówiąc, żadne rozwiązanie nie wymaga osobnej funkcji. Celem funkcji nie jest spowodowanie, aby wiele linii kodu wyglądało jak jedna linia kodu. Celem tej funkcji jest ustawienie standardowego procesu sprawdzania JSON wszędzie w aplikacji, tak aby różni programiści (lub ten sam programista w czasie) nie używali różnych procedur sprawdzania na różnych etapach przepływu programu.Używanie
json_decode
do „sondowania” może nie być najszybszym sposobem. Jeśli jest to struktura głęboko zagnieżdżona, wówczas tworzenie wielu obiektów tablic w celu ich wyrzucenia jest stratą pamięci i czasu.Może być więc szybszy w użyciu,
preg_match
a wyrażenie RFC4627 regex, aby również zapewnić ważność :To samo w PHP:
Jednak nie ma wystarczającej liczby entuzjastów wydajności, aby zawracać sobie głowę testami.
źródło
json_decode
jest zawsze szybsze niż wyrażenie PCRE. (Chociaż nie jest bardzo zoptymalizowany, nie znaleziono testów syntetycznych i może zachowywać się inaczej w Perlu ..)\r
\n
\t
to sens tylko dlatego, że PHP ich nie interpoluje, ale niech PCRE je interpretuje (było to wymagane tylko w/x
trybie). Inne okazje tego nie potrzebują; jednak wciąż „odwrotny ukośnik ucieka się” we wszystkich ciągach PHP. Można więc uznać to za bardziej dokładne.Zwróci wartość true, jeśli ciąg znaków reprezentuje tablicę lub obiekt Json :
Odrzuca ciągi JSON, które zawierają tylko liczbę, ciąg lub wartość logiczną, chociaż ciągi te są technicznie poprawne JSON.
To najkrótsza droga, jaką mogę wymyślić.
źródło
var_dump(isJson('[]')); // bool(false)
. Zgodnie z dokumentacją dotyczącą boolanów jest tak, ponieważ PHP ocenia tablice z zerowymi elementami jako fałszywe. Oto niewielka poprawka w celu dostosowania deklaracji zwrotu; wykonuje identyczne porównanie na zdekodowanym wyjściu, który obsługuje ten przypadek:return $json !== false && $str != $json;
isJson('hello')
true, co nie jest prawidłowym jsonem. Tutaj wybiera się luźne porównanie. Nie mam szybkiego rozwiązania sytuacji pustej tablicy / obiektu, z wyjątkiem brzydkiegoreturn $json == '[]' || ...
Najprostszy i najszybszy sposób, którego używam, jest następujący;
Jest tak, ponieważ json_decode () zwraca NULL, jeśli wprowadzony ciąg nie jest json lub nieprawidłowy json.
Prosta funkcja sprawdzania poprawności JSON
Jeśli musisz sprawdzić JSON w wielu miejscach, zawsze możesz skorzystać z następującej funkcji.
W powyższej funkcji otrzymasz true w zamian, jeśli jest to poprawny JSON.
źródło
json_decode('null') == NULL
inull
jest prawidłową wartością JSON.JSON.parse('null')
w konsoli programisty.http://tr.php.net/manual/en/function.json-decode.php wartość zwracana jest pusta, gdy wykryte zostanie nieprawidłowe kodowanie.
źródło
json_decode($str)!=null;
przeciwnym razie funkcja powinna zostać wywołanais_not_json
.json_decode('null')
jest poprawnym JSON zgodnie ze specyfikacją i powinien zwrócić wartośćnull
.is_json('false')
iis_json('[]')
wróci,false
ponieważ typ nie jest zaznaczony. Myślę, że ta metoda powinna raczej wrócić$str === null || json_decode($str) !== null
.Musisz sprawdzić poprawność danych wejściowych, aby upewnić się, że przekazany ciąg nie jest pusty i jest w rzeczywistości ciągiem. Pusty ciąg jest niepoprawny JSON.
Myślę, że w PHP ważniejsze jest ustalenie, czy obiekt JSON ma nawet dane, ponieważ aby użyć danych, musisz zadzwonić
json_encode()
lubjson_decode()
. Sugeruję odrzucenie pustych obiektów JSON, abyś nie musiał niepotrzebnie uruchamiać kodowania i dekodowania pustych danych.źródło
'0'
to nie ważne, Json ... dlaczego miałbym być ostrożny? @KzqaiTo zrobi to:
Jak pokazano w innych odpowiedziach,
json_last_error()
zwraca każdy błąd z naszego ostatniego json_decode (). Istnieją jednak przypadki użycia krawędzi, w których sama ta funkcja nie jest wystarczająco kompleksowa. Na przykład, jeśli maszjson_decode()
liczbę całkowitą (np .:)123
lub ciąg liczb bez spacji lub innych znaków (np .:"123"
:),json_last_error()
funkcja nie wykryje błędu.Aby temu przeciwdziałać, dodałem dodatkowy krok, który gwarantuje, że wynikiem naszego działania
json_decode()
będzie obiekt lub tablica. Jeśli nie, wrócimyfalse
.Aby zobaczyć to w działaniu, sprawdź te dwa przykłady:
json_last_error()
źródło
"hello"
jest poprawnym JSON i nie jest obiektem ani tablicą,json_last_error()
wystarczyjson_last_error()
zwraca kod błędu,4
gdyjson_decode()
ciąg"hello"
. Przykład tutaj: 3v4l.org/lSsEohello
nie jest prawidłowym JSON, ale"hello"
jest to 3v4l.org/OEJrQProstą metodą jest sprawdzenie wyniku JSON ..
źródło
w GuzzleHttp :
źródło
Wcześniej sprawdzałem tylko wartość zerową, co w rzeczywistości było błędne.
Powyższy fragment kodu działa dobrze z łańcuchami. Jednak jak tylko podam numer, to się rozpada. Na przykład.
Naprawienie tego, co zrobiłem, było bardzo proste.
źródło
źródło
Kolejny prosty sposób
źródło
json_decode($str,true)
powoduje, że konwertuje obiekty na tablice, dzięki czemu przejdzie kontrolę is_array. Jednak poprawiasz ciągi, liczby całkowite itp.Musimy sprawdzić, czy przekazany ciąg nie jest liczbowy, ponieważ w tym przypadku kod_json nie zgłasza błędu.
źródło
Wypróbowałem niektóre z tych rozwiązań, ale nic mi nie działało. Próbuję tej prostej rzeczy:
Myślę, że to dobre rozwiązanie, ponieważ dekodowanie JSON bez drugiego parametru daje obiekt.
EDYCJA: Jeśli wiesz, co będzie dane wejściowe, możesz dostosować ten kod do swoich potrzeb. W moim przypadku wiem, że mam Jsona, który zaczyna się od „{”, więc nie muszę sprawdzać, czy jest to tablica.
źródło
Korzystając z PHPBench z następującą klasą, osiągnięto poniższe wyniki:
Wniosek: najszybszym sposobem sprawdzenia, czy json jest prawidłowy, jest zwrócenie
json_decode($json, true) !== null)
.źródło
Znalazłem to pytanie po wczorajszym napotkaniu czegoś podobnego w mojej pracy. Moje rozwiązanie ostatecznie stanowiło hybrydę niektórych z powyższych podejść:
źródło
Nie wiem o wydajności ani elegancji mojego rozwiązania, ale właśnie tego używam:
Ponieważ wszystkie moje ciągi kodowane w JSON zaczynają się od {", wystarczy przetestować to za pomocą RegEx. W ogóle nie jestem biegły w RegEx, więc może być lepszy sposób, aby to zrobić. Ponadto: strpos () może być szybszy.
Po prostu próbuję oddać moją wartość dwupensową.
PS Właśnie zaktualizowałem ciąg RegEx,
/^[\[\{]\"/
aby znaleźć również ciągi tablic JSON. Więc teraz szuka albo „” albo {”na początku łańcucha.źródło
Powinno być coś takiego:
UnitTest
źródło
ErrorException
jeśli ciąg znaków jest tablicą lub obiektem.Rozszerzanie tej odpowiedzi Co powiesz na następujące kwestie:
źródło
Cześć, oto mały fragment z mojej biblioteki, w tym pierwszym stanie sprawdzam tylko, czy dane to json, a następnie zwracam je, jeśli są poprawnie zdekodowane, zwróć uwagę na użycie substratu dla wydajności (nie widziałem jeszcze żadnego pliku json, który nie zaczynał przez {lub [
źródło
Kolejna sugestia ode mnie :)
źródło
Funkcja niestandardowa
Skrzynie
Zasoby
https://gist.github.com/rafasashi/93d06bae83cc1a1f440b
źródło
Świeżo wykonana funkcja dla zgodności z PHP 5.2, jeśli potrzebujesz zdekodowanych danych na sukces:
Stosowanie:
Niektóre testy:
źródło
źródło
Prosta modyfikacja odpowiedzi Henryka, aby dotknąć najbardziej wymaganych możliwości.
(w tym „{} i []”)
źródło
Najszybszym sposobem może być dekodowanie możliwego obiektu JSON na obiekt / tablicę PHP:
źródło
Oto wydajna i prosta funkcja, którą utworzyłem (która wykorzystuje podstawową weryfikację ciągu przed użyciem
json_decode
dla większych ciągów):źródło