如何创建通用数据类型以访问 Json 响应的内部边界

Posted

技术标签:

【中文标题】如何创建通用数据类型以访问 Json 响应的内部边界【英文标题】:How to create a generic datatype to access a inner parameter of a Json Response 【发布时间】:2021-07-25 05:53:41 【问题描述】:

如果您查看 ENERC_KCAL、FAT、FASAT、FAMS 下面的代码,它们都具有相同的 3 个参数 labelquantityunit时间>。我想在我的 RecyclerAdapter 中设置标签和数量值以填充 recylerView。

"totalNutrients":
   "ENERC_KCAL":
      "label":"Energy",
      "quantity":2493.0949190757847,
      "unit":"kcal"
   ,
   "FAT":
      "label":"Fat",
      "quantity":2.275,
      "unit":"g"
   ,
   "FASAT":
      "label":"Saturated",
      "quantity":0.0665,
      "unit":"g"
   ,
   "FAMS":
      "label":"Monounsaturated",
      "quantity":0.224,
      "unit":"g"
   


但是,在我的数据类中,正在创建 ENERC_KCAL、FAT、FASAT、FAMS 类型的单个对象(我正在使用 Json 到 Kotlin 类插件),格式如下



                    data class ENERCKCAL(
                    @SerializedName("label")
                    val label: String?,
                    @SerializedName("quantity")
                    val quantity: Double?,
                    @SerializedName("unit")
                    val unit: String?
                )

                data class FAT(
                    @SerializedName("label")
                    val label: String?,
                    @SerializedName("quantity")
                    val quantity: Double?,
                    @SerializedName("unit")
                    val unit: String?
                )

                data class FASAT(
                    @SerializedName("label")
                    val label: String?,
                    @SerializedName("quantity")
                    val quantity: Double?,
                    @SerializedName("unit")
                    val unit: String?
                )

有没有办法生成一个 GenericClass 来访问标签和数量值,或者我如何访问当前结构中的值?

【问题讨论】:

【参考方案1】:

如果你想在 recyclerview 中显示你的数据,试试这个:

  data class TotalNutrients(@SerializedName("ENERC_KCAL")val enerc:Nutrient, @SerializedName("FAT")val fat:Nutrient, @SerializedName("FASAT")val fasat:Nutrient, @SerializedName("FAMS")val fams:Nutrient) 

        data class Nutrient(@SerializedName("label")
                            val label: String?,
                            @SerializedName("quantity")
                            val quantity: Double?,
                            @SerializedName("unit")
                            val unit: String?
        )
        
        fun getArrayList():ArrayList<Nutrient>
            return arrayListOf(enerc,fat,fasat,fams)
        

    

现在您可以使用 getArrayList() 来填充回收站视图

【讨论】:

这行得通。但是,在我的项目中,我有 45 个元素,例如 ENERC_KCAL 等。还有其他选择吗? 也许是这样的:***.com/questions/16295949/…【参考方案2】:

如果您有很多相似的数据类,对于同样的问题有更好的解决方案。

data class Nutrient(@SerializedName("label")
                            val label: String?,
                            @SerializedName("quantity")
                            val quantity: Double?,
                            @SerializedName("unit")
                            val unit: String?
        )

并在上层数据类中将其定义为

val valuesOfNutrients:Map&lt;String, Nutrient&gt;

然后您可以使用valuesOfNutrients.value 访问所有元素,而无需中间数据类

【讨论】:

以上是关于如何创建通用数据类型以访问 Json 响应的内部边界的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 retorfit2 创建用于解析 Json 的通用模型类?

如何在 ios 中解析这种类型的 JSON 响应? [复制]

如何在backbone.js中安全地发送/接收数据

如何在 NSDictionary 中访问本地 JSON 文件响应以在 UITableView 中显示?

无法使用 Alamofire 和 SwiftyJSON 访问数组内部的 url,JSON 响应

如何通过 JSONP 或 HTTP 代理访问 Rally REST API 的 JSON 响应?