довольно не уверен, как десериализовать вложенные объекты JSON с помощью moshi - PullRequest
0 голосов
/ 31 мая 2018

возникли проблемы с десериализацией этого вызова GET с использованием moshi

https://min -api.cryptocompare.com / data / pricemultifull? Fsyms = 007,1337 & tsyms = EUR, USD результат выглядит следующим образом.

{
   "RAW":{
     //not used 
},
"DISPLAY":{
  "1337":{
     "EUR":{
    "FROMSYMBOL":"1337",
    "TOSYMBOL":"€",
     "MARKET":"CryptoCompare Index",
    "PRICE":"€ 0.0001115",
    "LASTUPDATE":"Just now",
    "LASTVOLUME":"1337 0",
    "LASTVOLUMETO":"€ 0",
    "LASTTRADEID":0,
    "VOLUMEDAY":"1337 0",
    "VOLUMEDAYTO":"€ 0",
    "VOLUME24HOUR":"1337 0",
    "VOLUME24HOURTO":"€ 0",
    "OPENDAY":"€ 0.0001018",
    "HIGHDAY":"€ 0.0001115",
    "LOWDAY":"€ 0.0001018",
    "OPEN24HOUR":"€ 0.0001115",
    "HIGH24HOUR":"€ 0.0001115",
    "LOW24HOUR":"€ 0.0001018",
    "LASTMARKET":"Yobit",
    "CHANGE24HOUR":"€ 0.0",
    "CHANGEPCT24HOUR":"0.00",
    "CHANGEDAY":"€ 0.0000097",
    "CHANGEPCTDAY":"9.52",
    "SUPPLY":"1337 28,988,904,177.4",
    "MKTCAP":"€ 3,232.91 K",
    "TOTALVOLUME24H":"1337 1,360.28 K",
    "TOTALVOLUME24HTO":"€ 151.70"
     },
      "USD":{
      "FROMSYMBOL":"1337",
    "TOSYMBOL":"$",
    "MARKET":"CryptoCompare Index",
    "PRICE":"$ 0.0001490",
    "LASTUPDATE":"4 hours ago",
    "LASTVOLUME":"1337 12,553.1",
    "LASTVOLUMETO":"$ 1.87",
    "LASTTRADEID":"200003428",
    "VOLUMEDAY":"1337 19,183.0",
    "VOLUMEDAYTO":"$ 2.81",
    "VOLUME24HOUR":"1337 28,256.0",
    "VOLUME24HOURTO":"$ 3.95",
    "OPENDAY":"$ 0.0001250",
    "HIGHDAY":"$ 0.0001490",
    "LOWDAY":"$ 0.0001250",
    "OPEN24HOUR":"$ 0.0001250",
    "HIGH24HOUR":"$ 0.0001490",
    "LOW24HOUR":"$ 0.0001250",
    "LASTMARKET":"Yobit",
    "CHANGE24HOUR":"$ 0.000024",
    "CHANGEPCT24HOUR":"19.20",
    "CHANGEDAY":"$ 0.000024",
    "CHANGEPCTDAY":"19.20",
    "SUPPLY":"1337 28,988,904,177.4",
    "MKTCAP":"$ 4,319.35 K",
    "TOTALVOLUME24H":"1337 1,360.28 K",
    "TOTALVOLUME24HTO":"$ 202.43"
 }
 },
 "007":{
 "EUR":{
    "FROMSYMBOL":"007",
    "TOSYMBOL":"€",
    "MARKET":"CryptoCompare Index",
    "PRICE":"€ 1.08",
    "LASTUPDATE":"Just now",
    "LASTVOLUME":"007 0",
    "LASTVOLUMETO":"€ 0",
    "LASTTRADEID":0,
    "VOLUMEDAY":"007 0",
    "VOLUMEDAYTO":"€ 0",
    "VOLUME24HOUR":"007 0",
    "VOLUME24HOURTO":"€ 0",
    "OPENDAY":"€ 1.08",
    "HIGHDAY":"€ 1.08",
    "LOWDAY":"€ 1.08",
    "OPEN24HOUR":"€ 1.08",
    "HIGH24HOUR":"€ 1.08",
    "LOW24HOUR":"€ 1.08",
    "LASTMARKET":"Yobit",
    "CHANGE24HOUR":"€ 0.0",
    "CHANGEPCT24HOUR":"0.00",
    "CHANGEDAY":"€ -0.00013",
    "CHANGEPCTDAY":"-0.01",
    "SUPPLY":"007 0",
    "MKTCAP":"€ 0",
    "TOTALVOLUME24H":"007 0",
    "TOTALVOLUME24HTO":"€ 0"
 },
     "USD":{
    "FROMSYMBOL":"007",
    "TOSYMBOL":"$",
    "MARKET":"CryptoCompare Index",
    "PRICE":"$ 6.51",
    "LASTUPDATE":"4 months ago",
    "LASTVOLUME":"007 0.01536",
    "LASTVOLUMETO":"$ 0.1000",
    "LASTTRADEID":"182056756",
    "VOLUMEDAY":"007 0",
    "VOLUMEDAYTO":"$ 0",
    "VOLUME24HOUR":"007 0",
    "VOLUME24HOURTO":"$ 0",
    "OPENDAY":"$ 6.51",
    "HIGHDAY":"$ 6.51",
    "LOWDAY":"$ 6.51",
    "OPEN24HOUR":"$ 6.51",
    "HIGH24HOUR":"$ 6.51",
    "LOW24HOUR":"$ 6.51",
    "LASTMARKET":"Yobit",
    "CHANGE24HOUR":"$ 0.0",
    "CHANGEPCT24HOUR":"0.00",
    "CHANGEDAY":"$ -0.00034",
    "CHANGEPCTDAY":"-0.01",
    "SUPPLY":"007 0",
    "MKTCAP":"$ 0",
    "TOTALVOLUME24H":"007 0",
    "TOTALVOLUME24HTO":"$ 0"
   }
  }
 }
}

получая следующую ошибку.

com.squareup.moshi.JsonDataException: Required value 'displayMapToCurrency' 
missing at $.DISPLAY.1337

я использую следующие классы данных, один оборачивая другой

// внешний класс

data class FullPriceWrapper(
@Json( name = "DISPLAY")
val DISPLAY : Map<String, FullPriceWrapperInternalDisplay>
)

// промежуточный класс

data class FullPriceWrapperInternalDisplay(
   val displayMapToCurrency : Map<String,CurrencyFullPriceDataDisplay>
)

// самый внутренний класс

data class CurrencyFullPriceDataDisplay(
@Json(name = "FROMSYMBOL")
val FROMSYMBOL: String,
@Json(name = "TOSYMBOL")
val TOSYMBOL: String,
@Json(name = "MARKET")
val MARKET: String)

, поэтому я предполагаю, что промежуточный класс здесь не создаетсясообщение об ошибке?Есть ли проблема в моши с вложенными классами?Я создаю свой экземпляр API с модификацией, как показано ниже, передавая MoshiConverterFactory.

return Retrofit.Builder()
            .baseUrl(compareApiEndPoint)
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .addConverterFactory(MoshiConverterFactory.create(moshi))
            .build().create(CryptoApi::class.java)

Я также попробовал аннотацию генерации кода для создания адаптеров для меня в каждом классе, но без радости.адаптеры генерируются.может быть, я неправильно понял, но я подумал, что они были сгенерированы автоматически с аннотацией?(показано ниже)

@JsonClass(generateAdapter = true)

Но я думаю, что в настоящее время я недостаточно знаком с библиотекой.Мне интересно, если мне нужно добавить пользовательский адаптер, как я видел в других примерах?Я также пробовал это, но я не уверен, как создать эти адаптеры из примеров, которые я видел?Если у кого-то есть идеи, как исправить эту ошибку, это было бы здорово!Также я надеюсь, что вопрос был относительно точным.Спасибо!

...