API 响应使用 Retrofit returns 对某些不为 null 的参数为 null

API response using Retrofit returns null for certain parameters which aren't null

我正在为我的 android 应用程序使用 Retrofit,但很少有参数返回为 null 而其他参数有值,它在 POSTMAN 上运行良好。

我正在为 Api 调用的函数:

private fun apiCall(search: String): List<SortedApiData> {

    var recyclerDataList: List<SortedApiData> = ArrayList<SortedApiData>()

    val consumer = OkHttpOAuthConsumer("9c6c751a78db41b9a8bec92ef28c7656", "3f302d7930a74c1db0304ce675d4d41b")
    consumer.setTokenWithSecret("","")

    val client1 = OkHttpClient.Builder()
        .addInterceptor(SigningInterceptor(consumer))
        .build()

    var retrofit : Retrofit = Retrofit.Builder()
        .baseUrl(BaseUrl)
        .client(client1)
        .addConverterFactory(GsonConverterFactory.create())
        .build()

    val api: Client = retrofit.create(Client::class.java)
    val call: retrofit2.Call<ApiData?>? = api.getResponse(search, 5, 0, 0)

    call?.enqueue(object : Callback<ApiData?> {
        override fun onFailure(call: retrofit2.Call<ApiData?>, t: Throwable?) {
            Log.v("retrofit", t.toString())
        }

        override fun onResponse(call: retrofit2.Call<ApiData?>, response: Response<ApiData?>) {
            val data: ApiData? = response.body()
            popUprecycler.visibility = View.VISIBLE

            Log.v("retrofit", data.toString())

            recyclerDataList = createList(data)
            adapter = PopUpAdapter(this@PopPage, recyclerDataList)
            popUprecycler.layoutManager = GridLayoutManager(applicationContext, 2)
            popUprecycler.itemAnimator = DefaultItemAnimator()
            popUprecycler.setHasFixedSize(true)
            popUprecycler.adapter = adapter
            Log.i("Shrey", "shit")
        }
})
    return recyclerDataList
}

@GET请求函数:

interface Client {

    @GET("{id}/icons")
    fun getResponse(@Path("id") id: String?,@Query("limit") limit: Int?,@Query("offset") offset: Int?,@Query("page") page: Int?): Call<ApiData?>?
}

型号class:

public class ApiData{
    private int total;
    private String generatedAt;
    private Collection collection;
    private List<IconsItem> icons;

    public int getTotal(){
        return total;
    }

    public String getGeneratedAt(){
        return generatedAt;
    }

    public Collection getCollection(){
        return collection;
    }

    public List<IconsItem> getIcons(){
        return icons;
    }
}

图标模型Class:

public class IconsItem{
    private Sponsor sponsor;
    private String uploaderId;
    private String isActive;
    private String nounjiFree;
    private int year;
    private String dateUploaded;
    private Object sponsorCampaignLink;
    private int termId;
    private String sponsorId;
    private String termSlug;
    private String licenseDescription;
    private List<TagsItem> tags;
    private String attributionPreviewUrl;
    private String updatedAt;
    private String previewUrl;
    private Uploader uploader;
    private String attribution;
    private String previewUrl42;
    private String freemium;
    private String term;
    private String id;
    private String permalink;
    private String isExplicit;
    private String previewUrl84;

    public Sponsor getSponsor(){
        return sponsor;
    }

    public String getUploaderId(){
        return uploaderId;
    }

    public String getIsActive(){
        return isActive;
    }

    public String getNounjiFree(){
        return nounjiFree;
    }

    public int getYear(){
        return year;
    }

    public String getDateUploaded(){
        return dateUploaded;
    }

    public Object getSponsorCampaignLink(){
        return sponsorCampaignLink;
    }

    public int getTermId(){
        return termId;
    }

    public String getSponsorId(){
        return sponsorId;
    }

    public String getTermSlug(){
        return termSlug;
    }

    public String getLicenseDescription(){
        return licenseDescription;
    }

    public List<TagsItem> getTags(){
        return tags;
    }

    public String getAttributionPreviewUrl(){
        return attributionPreviewUrl;
    }

    public String getUpdatedAt(){
        return updatedAt;
    }

    public String getPreviewUrl(){
        return previewUrl;
    }

    public Uploader getUploader(){
        return uploader;
    }

    public String getAttribution(){
        return attribution;
    }

    public String getPreviewUrl42(){
        return previewUrl42;
    }

    public String getFreemium(){
        return freemium;
    }

    public String getTerm(){
        return term;
    }

    public String getId(){
        return id;
    }

    public String getPermalink(){
        return permalink;
    }

    public String getIsExplicit(){
        return isExplicit;
    }

    public String getPreviewUrl84(){
        return previewUrl84;
    }
}

API 响应注意突出显示的值不应为空:

正确的 API 响应:

请注意,未读变量是使用驼峰命名(中间的大字母)的变量,同时在 JSON 中,您使用下划线标记 _ 来分隔单词。正确读取的值只是那些在 JSON 中具有完全相同的键和在模型中具有完全相同的名称(因此没有下划线,两个地方都没有大字母)。您应该为这些字段使用 @SerializedName 注释,例如

@SerializedName("attribution_preview_url") // real key in JSON
private String attributionPreviewUrl;

也值得检查 setFieldNamingPolicy 方法,也许这可能会以某种方式自动化,而无需为模型中的每个驼峰命名命名(JSON 中带下划线的键)