Java odczytanie wartości ze Stringa jeśli pasuje do wzorca

Java odczytanie wartości ze Stringa jeśli pasuje do wzorca
0

Witam,
Nie mam pojęcia o wyrażeniach regularnych. Mam pewien kod JSON na przykład:
{"id":1,"author":"Wiadomosc","content":"Pewna wiadomosc"}

Mój cel jest następujący:

  1. Sprawdzić czy łańcuch String zawiera konstrukcje '{"id":liczba,' na samym jego poczatku.
  2. Jesli zawiera wczytac ta liczbe.

Pomysl na wyrazenie regularne wyglada mniej wiecej tak (nie mam doswiadczenia w ich tworzeniu):
^\"id\"[1-9][0-9]{}+

Jak najsensowniej sie za to zabrac?

Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:około 13 godzin
0

Po co tutaj regexy? Przecież taki np Jackson może ci to przerobić na mniej więcej Map<String, String> i już możesz sprawdzić czy w niej jest ciąg "id".


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
0

Myślałem, że tak będzie prościej tzn. sprawdzić czy jest ok, a jak jest ok to od razu deserializowac do obiektów Javy, w zależności od typu obiektu.

Jak to zrobić w Jacksonie z tym odczytem? Zrobiłem na szybko tak:

Kopiuj
Map<String, Integer> userData= mapper.readValue(json, Map.class);
System.out.println(userData.get("id"));

W sumie jest to fajne, ale w jaki sposób można ograniczyć to tak, aby jedną wartością wczytywaną do userData było "id"?

Pozdrawiam,

Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:około 13 godzin
0

Żeby uniknąć wczytywania całego stringa musiałbyś zejść jeszcze niżej i używać chyba JsonParsera uzyskanego za pomocą JsonFactory.createParser.

Generalnie Jackson może pracować w trzech trybach:

  • deserializacja do konkretnej hierarchii klas,
  • deserializacja do hierarchii ogólnych kolekcji (jak np mapa czy lista),
  • parsowanie i zwracanie tokenów na bieżąco, bez tworzenia jakichś hierarchii obiektów po drodze (co najwyżej jakiś stos np nawiasów otwierających, ale to już wewnętrzny szczegół),

Tutaj musisz właśnie użyć tego trzeciego sposobu.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 2x, ostatnio: Wibowit
0

Ok, dzięki.

Antoniossss
  • Rejestracja:prawie 16 lat
  • Ostatnio:ponad 10 lat
0

a ja bym sobie splitnął po przecinku a później po równości lub grupami regexa trzaskał;]


www.toptraker.pl
TopTraker! - I wiesz co jest grane!
Mój własny projekt w Javie - najnowsza wersja już jest!
Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:około 13 godzin
0

No to nie dość, że regexpy są wolniejsze od sztywnej tokenizacji, to jeszcze splitowanie i trzaskanie regexpów jest zachłanne, czyli mając np 1 kilobajtowy obiekt całego być splitował, zamiast przerwać tokenizowanie od razu po znalezieniu klucza "id". Dodatkowo regexpy wcale nie musiałyby być bardziej czytelne, a raczej przeciwnie.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 2x, ostatnio: Wibowit
LN
  • Rejestracja:około 16 lat
  • Ostatnio:około rok
  • Postów:1398
0

To, skoro już mówimy o prymitywnych rozwiązaniach, nie lepiej:

  • wyszukać w ciągu podciąg "{id:"
  • jeśli ten ciąg został znaleziony, to czytać kolejne znaki, które są cyframi ALBO wczytać wszystko aż do napotkania "," od miejsca, w którym został znaleziony ten ciąg "{id:" i zinterpretować to jako integera ?

;)

Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:około 13 godzin
0

Tokenizacja JSONa z użyciem JsonParser to prymitywne rozwiązanie?


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
LN
Nie. To jest chyba najlepsze rozwiązanie. Ale bawienie się w "ręczny parser JSON'a - splity, itp." to już bardziej prymitywne ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.