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?

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".

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:

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,

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.

0

Ok, dzięki.

0

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

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.

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 ?

;)

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1