Deserializacja listy za pomocą GSON i Retrofit

Odpowiedz Nowy wątek
2019-02-05 09:55
0

Cześć ! Mam pytanie.
Jak zdeserializować takiego JSON-a:

[{
    "table": "A",
    "no": "024/A/NBP/2019",
    "effectiveDate": "2019-02-04",
    "rates": [{
        "currency": "bat (Tajlandia)",
        "code": "THB",
        "mid": 0.1194
    }, {
        "currency": "dolar amerykański",
        "code": "USD",
        "mid": 3.7408
    }, {
        "currency": "dolar australijski",
        "code": "AUD",
        "mid": 2.7040
    }, {
        "currency": "dolar Hongkongu",
        "code": "HKD",
        "mid": 0.4765
    }, {
        "currency": "dolar kanadyjski",
        "code": "CAD",
        "mid": 2.8575
    }, {
        "currency": "dolar nowozelandzki",
        "code": "NZD",
        "mid": 2.5772
    }, {
        "currency": "dolar singapurski",
        "code": "SGD",
        "mid": 2.7645
    }, {
        "currency": "euro",
        "code": "EUR",
        "mid": 4.2813
    }, {
        "currency": "forint (Węgry)",
        "code": "HUF",
        "mid": 0.013474
    }, {
        "currency": "frank szwajcarski",
        "code": "CHF",
        "mid": 3.7511
    }, {
        "currency": "funt szterling",
        "code": "GBP",
        "mid": 4.8868
    }, {
        "currency": "hrywna (Ukraina)",
        "code": "UAH",
        "mid": 0.1365
    }, {
        "currency": "jen (Japonia)",
        "code": "JPY",
        "mid": 0.034043
    }, {
        "currency": "korona czeska",
        "code": "CZK",
        "mid": 0.1664
    }, {
        "currency": "korona duńska",
        "code": "DKK",
        "mid": 0.5735
    }, {
        "currency": "korona islandzka",
        "code": "ISK",
        "mid": 0.031205
    }, {
        "currency": "korona norweska",
        "code": "NOK",
        "mid": 0.4422
    }, {
        "currency": "korona szwedzka",
        "code": "SEK",
        "mid": 0.4123
    }, {
        "currency": "kuna (Chorwacja)",
        "code": "HRK",
        "mid": 0.5774
    }, {
        "currency": "lej rumuński",
        "code": "RON",
        "mid": 0.9010
    }, {
        "currency": "lew (Bułgaria)",
        "code": "BGN",
        "mid": 2.1890
    }, {
        "currency": "lira turecka",
        "code": "TRY",
        "mid": 0.7151
    }, {
        "currency": "nowy izraelski szekel",
        "code": "ILS",
        "mid": 1.0306
    }, {
        "currency": "peso chilijskie",
        "code": "CLP",
        "mid": 0.00572
    }, {
        "currency": "peso filipińskie",
        "code": "PHP",
        "mid": 0.0714
    }, {
        "currency": "peso meksykańskie",
        "code": "MXN",
        "mid": 0.1954
    }, {
        "currency": "rand (Republika Południowej Afryki)",
        "code": "ZAR",
        "mid": 0.2797
    }, {
        "currency": "real (Brazylia)",
        "code": "BRL",
        "mid": 1.0221
    }, {
        "currency": "ringgit (Malezja)",
        "code": "MYR",
        "mid": 0.9138
    }, {
        "currency": "rubel rosyjski",
        "code": "RUB",
        "mid": 0.0570
    }, {
        "currency": "rupia indonezyjska",
        "code": "IDR",
        "mid": 0.00026806
    }, {
        "currency": "rupia indyjska",
        "code": "INR",
        "mid": 0.052192
    }, {
        "currency": "won południowokoreański",
        "code": "KRW",
        "mid": 0.003341
    }, {
        "currency": "yuan renminbi (Chiny)",
        "code": "CNY",
        "mid": 0.5528
    }, {
        "currency": "SDR (MFW)",
        "code": "XDR",
        "mid": 5.2194
    }]
}]

Kiedy mam tego JSON-a jako tekst w kodzie to deserializuje go tak:

        val json = "moj json"
        val gson = GsonBuilder().create()
        val listType = object : TypeToken<List<MainModel>>() {}.type
        gson.fromJson<Deserialize>(json, listType)

Wtedy wszystko działa.

Gdy próbuję pobrać ten JSON za pomocą Retrofit-a to pokazuje się mi taki błąd:

 com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $

Ten sam błąd miałem przy deserializacji ze zmiennej, ale naprawiłem to za pomocą TypeToken.

Czy da się to jakoś zaimplementować do Retrofit-a ?

Pozostało 580 znaków

2019-02-05 10:33
0

A jaka odpowiedz przychodzi z Retrofita? Nie widze tutaj potrzeby uzywania TypeTokena.

Call z retrofita wyglada pewnie jakos tak Call<List<MainModel>>

gdzie

class MainModel {
  String table;
  String no;
  String effectiveDate;
  List<Rate> rates;
}
class Rate {
  String currency;
  String code;
  ...
}

Pozostało 580 znaków

2019-02-05 10:37
0

To wygląda tak call: Call<MainModel>

Pozostało 580 znaków

2019-02-05 10:44

Jesli z sieci przychodzi taki JSON jak wkleiles to blad jest prawidlowy. Przychodzi lista obiektow a nie obiekt (nawias kwadratowy jest pierwszy)
Expected BEGIN_OBJECT but was BEGIN_ARRAY

w tej chwili oczekujesz ze przyjdzie obiekt: Call<MainModel>

Pozostało 580 znaków

2019-02-05 10:48
0

Zmieniłem to i wszystko działa. Dzięki !

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