如何将json转换为pojo kotlin

mbzjlibv  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(392)

我有一个包含产品类别的json文件。我正在尝试将生成的json文件转换为kotlin类,以便将来可以在recyclerview中显示生成的数据。我创建了必要的pojo类,在日志中我看到我从服务器获得了正确的数据。但当我试图从片段中记录数据时,我发现我的数据是空的。我怎样才能解决这个问题?json示例:

{
  "beauty_health": [
    {
      "id": 1,
      "brand": "Kaya Youth",
      "category": "Beauty & Health",
      "name": "Hydro Replenish Face Wash",
      "description": "Hydro Replenish Face Wash, With Aloe Vera",
      "price": 42,
      "icon": ""
    },
    {
      "id": 2,
      "brand": "Kaya Youth",
      "category": "Beauty & Health",
      "name": "Oxy-Infusion Face Wash",
      "description": "Kaya Youth Oxy-Infusion Face Wash,100",
      "price": 18,
      "icon": ""
    }],
  "electronics": [
    {
      "id": 1,
      "brand": "OnePlus",
      "category": "Electronics",
      "name": "OnePlus 8",
      "description": "OnePlus 8T 64GB",
      "price": 250,
      "icon": ""
    },],

pojo类示例:
//productlist类

data class ProductList(
    @SerializedName("beauty_health")
    var beautyHealth: List<BeautyHealth>,
    @SerializedName("electronics")
    val electronics: List<Electronic>,
    @SerializedName("fashion")
    val fashion: List<Fashion>,
    @SerializedName("image_slider")
    val imageSlider: List<ImageSlider>,
    @SerializedName("popular")
    val popular: List<Popular>,
    @SerializedName("sports")
    val sports: List<Sport>) : Serializable

//美容保健课

data class BeautyHealth(
    @SerializedName("brand")
    val brand: String,
    @SerializedName("category")
    val category: String,
    @SerializedName("description")
    val description: String,
    @SerializedName("icon")
    val icon: String,
    @SerializedName("id")
    val id: Int,
    @SerializedName("name")
    var name: String,
    @SerializedName("price")
    val price: Int) : Serializable

我的存储库:

api.onFetchAllProducts().enqueue(object : Callback<ProductList> {
            override fun onFailure(call: Call<ProductList>, t: Throwable) {
            }

            override fun onResponse(call: Call<ProductList>, response: Response<ProductList>) {

                mutableLiveData.postValue(response.body())
            }
        })
        return mutableLiveData

我的viewmodel:

fun onGetProductsList(): MutableLiveData<ProductList> {
        return apiRepository.onLoadProducts()
    }

还有我的片段:

mHomeViewModel.onGetProductsList().observe(viewLifecycleOwner, Observer { products ->

        Log.d(TAG, "onCreateView: $products")
    })

我的日志:

D/HomeFragment: onCreateView: null
6ojccjat

6ojccjat1#

如果你用的是kotlin的 data class 作为你的 Gson 模型,则必须为所有属性提供默认值。
在java中,所有对象都有默认的空值。如果选择使用kotlin数据类作为具有非null属性的模型,并且在json响应中缺少一个字段,则整个序列化将失败。
例如,尝试改变这一点:

data class BeautyHealth(
    @SerializedName("brand")
    val brand: String,
    @SerializedName("category")
    val category: String,
    @SerializedName("description")
    val description: String,
    @SerializedName("icon")
    val icon: String,
    @SerializedName("id")
    val id: Int,
    @SerializedName("name")
    var name: String,
    @SerializedName("price")
    val price: Int) : Serializable

收件人:

data class BeautyHealth(
    @SerializedName("brand")
    val brand: String = "",
    @SerializedName("category")
    val category: String = "",
    @SerializedName("description")
    val description: String = "",
    @SerializedName("icon")
    val icon: String = "",
    @SerializedName("id")
    val id: Int = 0,
    @SerializedName("name")
    var name: String = "",
    @SerializedName("price")
    val price: Int = 0) : Serializable

相关问题