【问题标题】:How correctly to serialize such JSON by means of GSON Android?如何通过 GSON Android 正确序列化此类 JSON?
【发布时间】:2017-12-07 09:30:09
【问题描述】:

如何通过 GSON Android 正确序列化此类 JSON?

  [
        {
            "id": "bitcoin", 
            "name": "Bitcoin", 
            "symbol": "BTC", 
            "rank": "1", 
            "price_usd": "15022.7", 
            "price_btc": "1.0", 
            "24h_volume_usd": "13711300000.0", 
            "market_cap_usd": "251264422255", 
            "available_supply": "16725650.0", 
            "total_supply": "16725650.0", 
            "max_supply": "21000000.0", 
            "percent_change_1h": "0.94", 
            "percent_change_24h": "17.4", 
            "percent_change_7d": "47.71", 
            "last_updated": "1512638053"
        }, 
        {
            "id": "ethereum", 
            "name": "Ethereum", 
            "symbol": "ETH", 
            "rank": "2", 
            "price_usd": "427.071", 
            "price_btc": "0.0291936", 
            "24h_volume_usd": "2007350000.0", 
            "market_cap_usd": "41078436955.0", 
            "available_supply": "96186435.0", 
            "total_supply": "96186435.0", 
            "max_supply": null, 
            "percent_change_1h": "-1.59", 
            "percent_change_24h": "-5.64", 
            "percent_change_7d": "-3.22", 
                "last_updated": "1512638054"
            }
    ]

数据类:

class AllCurrenсyData {

    @SerializedName("")
    @Expose
    var currency: List<Currency>? = null

}

class Currency {

    @SerializedName("price_usd")
    @Expose
    val priceUsd: String? = null

    @SerializedName("symbol")
    @Expose
    val symbol: String? = null

    @SerializedName("last_updated")
    @Expose
    val lastUpdated: String? = null

    @SerializedName("total_supply")
    @Expose
    val totalSupply: String? = null

    @SerializedName("24h_volume_usd")
    @Expose
    val jsonMember24hVolumeUsd: String? = null

    @SerializedName("price_btc")
    @Expose
    val priceBtc: String? = null

    @SerializedName("available_supply")
    @Expose
    val availableSupply: String? = null

    @SerializedName("market_cap_usd")
    @Expose
    val marketCapUsd: String? = null

    @SerializedName("percent_change_1h")
    @Expose
    val percentChange1h: String? = null

    @SerializedName("percent_change_24h")
    @Expose
    val percentChange24h: String? = null

    @SerializedName("name")
    @Expose
    val name: String? = null

    @SerializedName("max_supply")
    @Expose
    val maxSupply: String? = null

    @SerializedName("rank")
    @Expose
    val rank: String? = null

    @SerializedName("id")
    @Expose
    val id: String? = null

    @SerializedName("percent_change_7d")
    @Expose
    val percentChange7d: String? = null
}

为了实现这一点,我创建了这样的类。但是我正在听这样一堆错误:

FATAL EXCEPTION: main
                                                                     Process: it.incode.cryptocoins, PID: 2620
                                                                     io.reactivex.exceptions.OnErrorNotImplementedException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
                                                                         at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:704)
                                                                         at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:701)
                                                                         at io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:74)
                                                                         at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.checkTerminated(ObservableObserveOn.java:276)
                                                                         at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:172)
                                                                         at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:252)
                                                                         at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:109)
                                                                         at android.os.Handler.handleCallback(Handler.java:751)
                                                                         at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                         at android.os.Looper.loop(Looper.java:154)
                                                                         at android.app.ActivityThread.main(ActivityThread.java:6164)
                                                                         at java.lang.reflect.Method.invoke(Native Method)
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888)
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:778)
                                                                      Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
                                                                         at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224)
                                                                         at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:37)
                                                                         at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:25)
                                                                         at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:118)
                                                                         at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:212)
                                                                         at retrofit2.OkHttpCall.execute(OkHttpCall.java:174)
                                                                         at com.jakewharton.retrofit2.adapter.rxjava2.CallObservable.subscribeActual(CallObservable.java:41)
                                                                         at io.reactivex.Observable.subscribe(Observable.java:10842)
                                                                         at com.jakewharton.retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)
                                                                         at io.reactivex.Observable.subscribe(Observable.java:10842)
                                                                         at io.reactivex.internal.operators.observable.ObservableMap.subscribeActual(ObservableMap.java:33)
                                                                         at io.reactivex.Observable.subscribe(Observable.java:10842)
                                                                         at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
                                                                         at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452)
                                                                         at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
                                                                         at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
                                                                         at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                         at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272)
                                                                         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                                                                         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
                                                                         at java.lang.Thread.run(Thread.java:761)
                                                                      Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
                                                                         at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385)
                                                                         at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:213)
                                                                         at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:37) 
                                                                         at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:25) 
                                                                         at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:118) 
                                                                         at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:212) 
                                                                         at retrofit2.OkHttpCall.execute(OkHttpCall.java:174) 
                                                                         at com.jakewharton.retrofit2.adapter.rxjava2.CallObservable.subscribeActual(CallObservable.java:41) 
                                                                         at io.reactivex.Observable.subscribe(Observable.java:10842) 
                                                                         at com.jakewharton.retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34) 
                                                                         at io.reactivex.Observable.subscribe(Observable.java:10842) 
                                                                         at io.reactivex.internal.operators.observable.ObservableMap.subscribeActual(ObservableMap.java:33) 
                                                                         at io.reactivex.Observable.subscribe(Observable.java:10842) 
                                                                         at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96) 
                                                                         at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452) 
                                                                         at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61) 
                                                                         at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52) 
                                                                         at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                                                                         at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272) 
                                                                         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
                                                                         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
                                                                         at java.lang.Thread.run(Thread.java:761) 

很可能我没有正确处理没有序列化名称的数据数组。我希望有人能告诉我我的错误在哪里。

【问题讨论】:

  • 无论您在哪里使用AllCurrenсyData,只需使用List&lt;Currency&gt;。你最终的 json 是一个列表,你不需要像 AllCurrenсyData 这样的对象,只是一个列表。这也是你的例外所说的。
  • 谢谢!它正在工作。

标签: android json kotlin gson retrofit2


【解决方案1】:

您不需要对象AllCurrenсyData,您只需更改您的调用即可返回元素列表

fun getData() : Call<List<Currency>>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多