Jak sprawdzić poprawność ciągu JSON w Javie? A może mógłbym przeanalizować go przy użyciu wyrażeń regularnych?
java
json
validation
sappu
źródło
źródło
Odpowiedzi:
Dziki pomysł, spróbuj go przeanalizować i wyłap wyjątek:
Ten kod wykorzystuje implementację JSON API org.json, która jest dostępna na github , w maven i częściowo w systemie Android .
źródło
Biblioteka JACKSON
Jedną z opcji byłoby skorzystanie z biblioteki Jacksona . Najpierw zaimportuj najnowszą wersję (teraz jest):
Następnie możesz zaimplementować poprawną odpowiedź w następujący sposób:
Opcja Google GSON
Inną opcją jest użycie Google Gson . Zaimportuj zależność:
Ponownie możesz zaimplementować proponowane rozwiązanie jako:
Oto prosty test:
Proszę zauważyć, że może wystąpić „drobny” problem związany z końcowymi przecinkami, który zostanie naprawiony w wydaniu
3.0.0
.źródło
new ObjectMapper().readTree("28xjRBuOQqupRopHeSuhRQ")
Pułapka JACKSON: analizuje bez wyjątku jako IntNode (28). Niezupełnie oczekiwane ...Dzięki Google Gson możesz użyć JsonParser:
źródło
Możesz użyć .mayBeJSON (String str) dostępnego w bibliotece JSONUtils .
źródło
To zależy od tego, co próbujesz udowodnić w ramach walidacji. Z pewnością przeanalizowanie json, jak sugerowali inni, jest lepsze niż użycie wyrażeń regularnych, ponieważ gramatyka json jest bardziej skomplikowana niż można ją przedstawić za pomocą samych wyrażeń regularnych.
Jeśli json będzie kiedykolwiek analizowany tylko przez twój kod java, użyj tego samego parsera, aby go zweryfikować.
Ale samo przeanalizowanie niekoniecznie powie Ci, czy zostanie zaakceptowane w innych środowiskach. na przykład
Jeśli Twoja walidacja musi być bardzo dokładna, możesz:
źródło
Proszę pobrać bibliotekę stringtree-json
źródło
Trochę o parsowaniu:
Json, a właściwie wszystkie języki, używają gramatyki, która jest zestawem reguł, których można używać jako podstawień. aby przeanalizować json, musisz w zasadzie wypracować te podstawienia w odwrotnej kolejności
Json to gramatyka bezkontekstowa , co oznacza, że możesz mieć nieskończenie zagnieżdżone obiekty / tablice, a json nadal będzie prawidłowy. regex obsługuje tylko regularne gramatyki (stąd „reg” w nazwie), które są podzbiorem gramatyk bezkontekstowych, które nie pozwalają na nieskończone zagnieżdżanie, więc niemożliwe jest użycie tylko wyrażenia regularnego do przeanalizowania wszystkich prawidłowych plików json. możesz użyć skomplikowanego zestawu wyrażeń regularnych i pętli, zakładając, że nikt nie zagnieździ się powyżej, powiedzmy, 100 poziomów głębokości, ale nadal byłoby to bardzo trudne.
jeśli masz ochotę napisać swój własny parser,
możesz po opanowaniu gramatyki stworzyć rekurencyjny parser zstępujący
źródło
Sprawdź, czy podany ciąg jest prawidłowym JSON w Kotlinie . Przekonwertowałem odpowiedź MByD Java na Kotlin
źródło
Tutaj możesz znaleźć narzędzie, które może zweryfikować plik JSON lub po prostu deserializować plik JSON za pomocą dowolnej biblioteki JSON i jeśli operacja się powiedzie, to powinno być poprawne ( na przykład google-json , które wyrzuci wyjątek, jeśli dane wejściowe to analizowanie nie jest prawidłowym formatem JSON).
źródło
Korzystając z Playframework 2.6, można również użyć biblioteki Json znajdującej się w api Java, aby po prostu przeanalizować ciąg. Ciąg może być elementem json tablicy json. Ponieważ zwracana wartość nie ma tutaj znaczenia, po prostu przechwytujemy błąd analizy, aby określić, czy ciąg jest prawidłowym ciągiem json, czy nie.
źródło
IMHO, najbardziej eleganckim sposobem jest użycie Java API for JSON Processing (JSON-P), jednego ze standardów JavaEE, który jest zgodny z JSR 374 .
Używając Maven, dodaj zależność od JSON-P:
Odwiedź oficjalną stronę JSON-P, aby uzyskać więcej informacji.
źródło
Oto działający przykład ścisłego parsowania json z biblioteką gson :
Zobacz także moją inną szczegółową odpowiedź w artykule Jak sprawdzić, czy JSON jest poprawny w Javie przy użyciu GSON z dodatkowymi informacjami i rozszerzonym przypadkiem testowym z różnymi nieprawidłowymi przykładami.
źródło
Jak widać, rozwiązań jest sporo, głównie parsują one JSON, żeby to sprawdzić i na koniec trzeba będzie go przeanalizować, żeby mieć pewność.
Jednak w zależności od kontekstu można poprawić wydajność, sprawdzając wstępnie.
Kiedy wywołuję interfejsy API, po prostu sprawdzam, czy pierwszy znak to „{”, a ostatni to „}”. Jeśli tak nie jest, nie zawracam sobie głowy tworzeniem parsera.
źródło
Znalazłem na to bardzo proste rozwiązanie.
Najpierw zainstaluj
net.sf.json-lib
dla niego tę bibliotekę .Gotowe. Cieszyć się
źródło
Odpowiedzi są częściowo poprawne. Ja też stanąłem przed tym samym problemem. Przetwarzanie json i sprawdzanie wyjątku wydaje się zwykłym sposobem, ale rozwiązanie nie działa w przypadku wejściowego pliku JSON, podobnie jak
{"outputValueSchemaFormat": "", "sortByIndexInRecord": 0, "sortOrder": 847874874387209 "descending"} kajhfsadkjh
Jak widać, plik json jest nieprawidłowy, ponieważ zawiera końcowe znaki śmieci. Ale jeśli spróbujesz przeanalizować powyższy json za pomocą json lub gson, otrzymasz przeanalizowaną mapę prawidłowych json, a znaki końcowe json są ignorowane. Co nie jest wymaganym rozwiązaniem, gdy używasz parsera do sprawdzania poprawności json.
Rozwiązanie tego problemu znajdziesz tutaj .
PS: To pytanie zadałem i odpowiedziałem.
źródło
a następnie wywołaj tę funkcję, przekazując swój ciąg JSON :)
źródło
Powyższe rozwiązanie obejmuje oba scenariusze:
źródło
Rozwiązanie wykorzystujące
javax.json
bibliotekę:źródło
Możesz użyć
WellFormedJson
klasy z biblioteki walidacji deklaratywnej Validol .Sama deklaracja mogłaby wyglądać następująco:
Faza sprawdzania wygląda następująco:
Może się to wydawać przesadą w przypadku tak prostego zadania, ale sprawdza się, gdy trzeba zweryfikować złożone żądanie. Sprawdź sekcję szybkiego startu validol .
źródło