【问题标题】:Retrofit2 skipping inner elements in JSON repsonseRetrofit2 在 JSON 响应中跳过内部元素
【发布时间】:2019-08-15 15:29:29
【问题描述】:

我最近在我的 Android 项目中将我的 Retrofit 库从版本 1 升级到了 2,突然我整个项目中的各种映射都无法映射。我在不使用空值的地方有空值,我只能推测它来自失败的映射。

我意识到 Retrofit2 正在跳过我的 JSON 响应的内部元素/属性。因此,例如,此处将跳过操作

这是一个实例 - 自从升级改造后我没有接触过这个类,并且 JSON 响应没有改变。

public final class BXActionInfo extends BXBaseObject {

@SerializedName("_id")
private String id;
@JsonAdapter(ActionEntityTypeJsonAdapter.class)
private ActionEntityType entityType;
private List<BXActionReference> references;
private String referenceClientTitle;

...various getters and setters

这是我的 API 响应(应该映射到此类的部分):

_id": "5bcdf558b876ea01003ff581",
"text": "Camp Care Package!",
"subText": "Build your own!",
"position": 0,
"action": {
    "_id": "5bcdf558b876ea01003ff582",
    "entityType": 22,
    "references": [
    {
        "referenceType": 12,
        "product": null,
        "variant": null,
        "productId": null,
        "variantId": null,
        "category": null,
        "softCategory": null,
        "orderId": null,
        "url": null,
        "promoCode": null,
        "searchTerm": null,
        "brandId": null,
        "occassionId": "5aec8040bb944d0100d14038",
        "_id": "5bcdf571d43cea01005a18e2"
    }
    ],
    "referenceClientTitle": ""
},
"isExpressOnly": false

再一次,自第 2 版以来,改造地图的方式有什么变化吗?一定有什么,因为我的代码没有改变。

编辑:

这是 BXActionReference:

public final class BXActionReference extends BXBaseObject {

public enum ActionEntityType {
    ACTIONTYPELISTENTITIES, /***/
    ACTIONTYPEPRODUCT, /***/
    ACTIONTYPEVARIANT, /***/
    ACTIONTYPEURL, /***/
    ACTIONTYPENOREFERENCE, /***/
    ACTIONTYPESOFTCATEGORY, /***/
    ACTIONTYPEPRODUCTCATEGORY, /***/
    ACTIONTYPEORDERCREATED, /***/
    ACTIONTYPEORDERSHIPPED, /***/
    ACTIONTYPEORDERDELIVERED, /***/
    ACTIONTYPEORDERCANCELLED, /***/
    ACTIONTYPEEXPRESSORDERDELIVERED, /***/
    ACTIONTYPEEXPRESSORDERCONFIRMED, /***/
    ACTIONTYPEEXPRESSORDERCOMPLETESHOPPING, /***/
    ACTIONTYPEGIFTCARDORDER, /***/
    ACTIONTYPEGIFTCARDCANCELLED, /***/
    ACTIONTYPEPROMOCODE, /***/
    ACTIONTYPESEARCHRESULTS, /***/
    ACTIONTYPEIMAGE, /***/
    ACTIONTYPESMILEIMAGE, /***/
    ACTIONJOINLOGINACCOUNT
}
@SerializedName("_id")
@Expose
protected String id;
protected String url;
protected int referenceType;
protected String orderId;
protected BXVariant variant;
protected BXProduct product;
protected String variantId;
protected String productId;
protected BXRootSoftCategory softCategory;
protected BXRootCategoryChild category;
protected String promoCode;
protected String searchTerm;
protected String brandId;
protected String occassionId;

//setters and getters here...

这是我的改造构建器:

Retrofit restAdapter = new Retrofit.Builder()
            .baseUrl(baseUrl)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io()))
            .client(okHttpClient2.build())
            .build();

【问题讨论】:

  • 我可以看看你的 BXActionReference 吗?也是您的改造建筑商?
  • 我已将两者都添加到我原来的问题中。

标签: android json retrofit


【解决方案1】:

不幸的是,从 Retrofit 1 升级到 2 并非一蹴而就。仅看这段代码,我没有发现任何对我来说不正确的地方,但大多数人建议在改造 2 推出时完全重写您的服务层。

我建议您关注 Sasa Sekulic 的这篇精彩文章,该文章展示了如何逐步进行更改以确定您的重大更改在哪里。

https://medium.com/@sasa_sekulic/quick-and-easy-guide-to-retrofit-2-0-setup-or-migration-with-rxjava-ab7a11bc17df

【讨论】:

  • 我已经按照本指南进行了必要的更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多