GSon parsowanie JSON do obiektu klasy

Odpowiedz Nowy wątek
2019-04-18 21:28
0

Cześć
mam taki problem, mianowicie potrzebuję parsować takiego dżejsona

json.png

json2.png

Mam klasy:

  1. public class ClassA {
    private int a;
    private int b;
    private List<ClassB> c;
    
    geters and setters...
    }
  2. public class ClassB {
    private String a;
    private double b;
    private double c;
    private int d;
    private int e;
    private int f;
    private String g;
    private String h;
    private String i;
    private String j;
    private int k;
    private String l;
    private String m;
    private String n;
    private int o;
    private int p;
    private String r;
    private int s;
    private String t;
    
    geters and setters...
    }

Próbowałem załadować dane ze Stringa do listy ale nie działa. String był walidowany i jest poprawnym JSonem

String json = ...
...
Type listType = new TypeToken<ArrayList<ClassB>>(){}.getType();
List<ClassB> classB = new Gson().fromJson(json, listType);

wywala Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
domyślam się że spodziewa się tablicy ale w stringu z jsonem na pierwszym miejscu jest zwykłe pole

Nie wiem z której strony to "ugryźć"
mam jsona który ma zwykłe pola i pola jakiegoś typu które są rozwijane.
Może klasy powinny wyglądać inaczej?

W efekcie powinien powstać obiekt klasy ClassA z wypełnioną listą List<classb>

edytowany 5x, ostatnio: AfrykanskiPomorSwin, 2019-04-18 21:46
w legalnym JSON to co chcesz by było klasą, nigdy nią nie będzie, to jest tablica (array) - AnyKtokolwiek 2019-04-18 21:56
A jest jakiś sposób na przetworzenie tego by była klasą? Wiem że dało się tak zrobić bo dla innego jsona nie miałem z tym problemów tylko że tam była inna struktura danych - AfrykanskiPomorSwin 2019-04-18 22:10
https://www.json.org/json-pl.html coś, czego NIE MA w tym pliku to nazwy pól, ta informacja jest utracona. Jeśli ktoś obiecywał w tym pliku klasy, to nie wiedział co czyni. To jest tablica obiektów różnego typu. - AnyKtokolwiek 2019-04-18 22:19
Hmm ale musi się jakoś dać wyciągać z tego jsona dane bo strona która go ma sprawnie to robi :P - AfrykanskiPomorSwin 2019-04-18 22:47
każdy plik da się jakoś zinterpretować, zwłaszcza jak struktura jest z góry znana. Ale w pewnym momencie już nie mówimy o parsowaniu w stylu JSON. Parsuj go ręcznie jak chcesz - AnyKtokolwiek 2019-04-18 22:49
Zawiodłem się trochę, ale dziękuję za pomoc :P - AfrykanskiPomorSwin 2019-04-18 22:51

Pozostało 580 znaków

2019-04-19 08:36
0
  1. W pliku json.png mamy pola ~"203462b", "2033ff23" - te klucze są stałe czy będą się zmieniać niedeterministyczny pomiędzy zapytaniami?
  2. Warto zapoznać się z http://www.jsonschema2pojo.org/ - dla jsona który jest deterministyczny można wygenerować POJO
  3. 
    String json = ...
    ...
    Type listType = new TypeToken<ArrayList<ClassB>>(){}.getType();
    List<ClassB> classB = new Gson().fromJson(json, listType);```

To powinno wyglądać (pisane z palca) tak:
ClassA classA = new Gson().fromJson(json, ClassA.class);

edytowany 1x, ostatnio: lubie_programowac, 2019-04-19 08:36

Pozostało 580 znaków

2019-05-07 15:57
0
lubie_programowac napisał(a):
  1. W pliku json.png mamy pola ~"203462b", "2033ff23" - te klucze są stałe czy będą się zmieniać niedeterministyczny pomiędzy zapytaniami?
  2. Warto zapoznać się z http://www.jsonschema2pojo.org/ - dla jsona który jest deterministyczny można wygenerować POJO
  3. 
    String json = ...
    ...
    Type listType = new TypeToken<ArrayList<ClassB>>(){}.getType();
    List<ClassB> classB = new Gson().fromJson(json, listType);```

To powinno wyglądać (pisane z palca) tak:
ClassA classA = new Gson().fromJson(json, ClassA.class);

Dziękuje za odpowiedź. Właśnie w tym problem, że pola 203462b to identyfikatory i będą się zmieniały. Raz może być ich 1000 raz 479 raz 2 (w sumie każda dowolna ilość) a może też ich w ogóle nie być. Nie wiem czy to dobry pomysł ale załatwiłem to tak, że te elementy które nie będą się zmieniać ładuje do klasy tak jak napisałeś, a te pola ładuje parsując kod ręcznie, split'em indexOf substring itp itd i ustawiam setterami

edytowany 4x, ostatnio: AfrykanskiPomorSwin, 2019-05-07 16:15

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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