• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

JavaFX - pobieranie danych z pliku json za pomocą gson

Object Storage Arubacloud
+2 głosów
384 wizyt
pytanie zadane 24 lipca 2021 w Java przez Bartek030 Obywatel (1,460 p.)

Witam,

Chciałem prosić o drobną poradę z biblioteką gson.

Mam przykładowy plik danych w formacie json:

{
    "name": "Jan",
    "surname": "Kowalski",
    "address": {
        "street": "ogórkowa",
        "number": "67A"
    }
}

Dla przykładu potrzebuję wyciągnąć z niego tylko pola name oraz street. Czy aby wyciągnąć te pola muszę zadeklarować klasy i pola, zawierające wszystkie elementy z tego pliku (nawet jeśli nie będę ich wykorzystywał) czy wystarczy, że utworzę tylko te pola, które potrzebuję? Chodzi mi tutaj o to, czy funkcja fromJson() odczyta poprawnie wartości pól nawet jeśli nie definiuje ich wszystkich dostępnych w pliku json, lub definiuje je w różnej kolejności.

1 odpowiedź

0 głosów
odpowiedź 24 lipca 2021 przez Wiciorny Ekspert (269,710 p.)
wybrane 24 lipca 2021 przez Bartek030
 
Najlepsza

to nie jest JSON tylko JSON string. 

odczyta poprawnie wartości pól nawet jeśli nie definiuje ich wszystkich dostępnych w pliku json,

nie odczyta wartości pól bo ich nie zdefiniujesz.  

Czy aby wyciągnąć te pola muszę zadeklarować klasy i pola,

niekoniecznie, możesz je wyciągnąc jako type : Object, lub string. 
Możesz też skorzystać z jsonElement i pobrać swój plik jako JSON-ELEMENT, skonwertować do stringa i otrzymasz obiekt STRING w javie... z którego możesz pobrać dane. Wycinając lub jakoś konwertując 

public class GsonExample3 {

    public static void main(String[] args) {

        // pretty print 
        Gson gson = new GsonBuilder().setPrettyPrinting().create();

        try (Reader reader = new FileReader("c:\\projects\\staff.json")) {
        
            // Convert JSON to JsonElement, and later to String
            JsonElement json = gson.fromJson(reader, JsonElement.class);

            String jsonInString = gson.toJson(json);
            
            System.out.println(jsonInString);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }  
}

Prościej będzie skonwertować to jako mape OBJECT wtedy łatwiej bedzie Ci się dobrać po KLUCZ -> WARTOŚĆ 

ObjectMapper mapper = new ObjectMapper();
Map<String, Object> mystuff = mapper.readValue( jsonString, Map.class );
String name = (String)mystuff.get("name");
String city = ((Map<String, Object>)mystuff.get( "address" )).get( "city" );

 

komentarz 24 lipca 2021 przez ScriptyChris Mędrzec (190,190 p.)

to nie jest JSON tylko JSON string

A czym jedno różni się od drugiego?

komentarz 24 lipca 2021 przez Wiciorny Ekspert (269,710 p.)

formatem zapisu json string jest zapisany 

{
    "name": "Jan",
    "surname": "Kowalski",
    "address": {
        "street": "ogórkowa",
        "number": "67A"
    }
}

a sam JSON jako obiekt tak: 

{
    'name': 'Jan',
    'surname': 'Kowalski',
    'address': {
        'street': 'ogórkowa',
        'number': '67A'
    }
}

I niestety to jest dosyć związane z Javą i jej frameworkami Mapperów, gdyż np w Springu nie ma opcji przesyłania JSON jako object-JSON, nawet jeśli wyślemy od klienta application/json to musimy go zrobic jako stringJSON bo tego będzie oczekiwał server np @RequestBody w springu 
W Javie jest to istotne, przy przesyłaniu tego poprzez endpoint i bardzo często rodzi to problem z parserem. 

JavaScript nie jest językiem typowanym, natomiast Java jest silnie typowana i ObjectMappery, GsonMapper  -> tutaj jest zdecydowana różnica czy otrzymasz String jako Json-String, czy obiekt JSONObject, albo nawet JsonElement

komentarz 24 lipca 2021 przez Bartek030 Obywatel (1,460 p.)

Dzięki za odpowiedź - dużo ciekawych rzeczy można się z tego dowiedzieć.

Szczerze mówiąc nawet nie zwróciłem uwagi na różnicę między Json a Json-string - API, które zwraca mi dane wysyła mi je jako Json-string więc nie miałem z nimi problemu. Nie dodałem tylko jednej rzeczy: wśród danych mam też wartości liczbowe, zapisane wprost bez " " czy ' '

Próbowałem wcześniej też metody z mapami, ale miałem problem ze zwracaniem wartości z obiektów - prawdopodobnie dlatego, że nie rzutowałem ich do odpowiedniego obiektu.

Na obecną chwilę w swoim projekcie użyłem innej metody, a konkretnie

try {
    String jsonString = returnConnectionResult(); // tutaj zwracam dane z API zamieniając je na końcu na String za pomocą metody toString()
    MyData myData = new Gson().fromJson(jsonString, MyData.class);
    } catch (IOException e) {
        e.printStackTrace();
    }

gdzie MyData jest stworzonym przeze mnie obiektem, w którym zamieszczam pola i obiekty o nazwach odpowiadających tym z json'a - i to fajnie działa, ponieważ mam tylko te dane, które potrzebuje i dodatkowo pogrupowane w ramach konkretnych obiektów co poprawia czytelność kodu. Wydaje mi się, że to daje przewagę nad metodą z mapami.

Natomiast co do samego odczytywania danych z json'a to znalazłem jeszcze jeden sposób:

LINK

Natomiast kiedy go implementowałem to wygenerowałem dużą ilość kodu, właśnie ze względu na potrzebę obsłużenia różnych typów wartości. Dlatego ostatecznie pozostałem przy powyższym rozwiązaniu.

Podobne pytania

0 głosów
0 odpowiedzi 140 wizyt
pytanie zadane 18 lutego 2020 w Java przez mm Użytkownik (890 p.)
0 głosów
0 odpowiedzi 234 wizyt
pytanie zadane 6 sierpnia 2017 w Java przez Rubeus024 Obywatel (1,680 p.)
0 głosów
0 odpowiedzi 261 wizyt
pytanie zadane 29 czerwca 2017 w Java przez XtrEmE Nowicjusz (200 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...