【问题标题】:Kotlin gson.fromJSON doesn't allow initialization at declarationKotlin gson.fromJSON 不允许在声明时初始化
【发布时间】:2021-03-17 23:52:06
【问题描述】:

使用 Kotlin:

我有一个变量名与我的 JSON 字段名不同的类。当我调用gson.fromJSON(string, Array<MyClass>::class.java 时,声明时不会发生初始化。

我从另一篇帖子中了解到declaration isn't called with constructor 只调用了唯一的构造函数。

那么,如何在不调用 gson.fromJSON 和调用我的类的情况下轻松地将我的 JSON 数据放入我的类中?

我不是一个非常高级的开发人员。我正在寻找尽可能简单且系统高效的代码。

我想做的是:

val gson = Gson()
val seriesFirebaseList = gson.fromJson(seriesJSONArrayString, Array<Series>::class.java).toList()
class Series(Series_Unique_ID: String,
             Series_Record_Name: String,
             Series_Name: String,
             Series_From_Year: Int,
             Series_To_Year: Int?,
             Is_Active: Int,
             Logo_Image_Name: String,
             Sort_Order: Int) {

    val uniqueId: String = Series_Unique_ID
    val recordName: String = Series_Record_Name
    val seriesName: String = Series_Name
    val fromYear: Int = Series_From_Year
    var toYear: Int? = Series_To_Year
    var isActive: Boolean = Is_Active == 1
    val logoImageName: String = Logo_Image_Name
    val sortOrder: Int = Sort_Order

    // generated data
    var imageFirebaseURLString: String? = null
    var isFavoriteSeries = false
}

但是,所有变量最终都是 null 或默认值,而不是 JSON 值。

我唯一可以开始工作但似乎效率很低的事情是调用 JSON firebase 类,然后将其转换为我的类

        val gson = Gson()
        // create seriesFirebase
        val seriesFirebaseList = gson.fromJson(seriesJSONArrayString, Array<SeriesFirebase>::class.java).toList()
        val seriesList = mutableListOf<Series>()
        seriesFirebaseList.forEach { seriesFirebase ->
            val series = Series(seriesFirebase)
            seriesList.add(series)
        }
// series models
class Series(seriesFirebase: SeriesFirebase) {

    val uniqueId: String = seriesFirebase.Series_Unique_ID
    val recordName: String = seriesFirebase.Series_Record_Name
    val seriesName: String = seriesFirebase.Series_Name
    val fromYear: Int = seriesFirebase.Series_From_Year
    var toYear: Int? = seriesFirebase.Series_To_Year
    var isActive: Boolean = seriesFirebase.Is_Active == 1
    val logoImageName: String = seriesFirebase.Logo_Image_Name
    val sortOrder: Int = seriesFirebase.Sort_Order

    // generated data
    var imageFirebaseURLString: String? = null
    var isFavoriteSeries = false
}

// used to convert Gson/JSON
class SeriesFirebase(val Series_Unique_ID: String,
                     val Series_Record_Name: String,
                     val Series_Name: String,
                     val Series_From_Year: Int,
                     val Series_To_Year: Int?,
                     val Is_Active: Int,
                     val Logo_Image_Name: String,
                     val Sort_Order: Int) {

    constructor() : this(
        "",
        "",
        "",
        0,
        2150,
        0,
        "",
        0
    )

    override fun toString(): String {
        return ("series: uniqueId: " + Series_Unique_ID
                + "; recordName: " + Series_Name
                + "; name: " + Series_Name
                + "; fromYear: " + Series_From_Year
                + "; toYear: " + Series_To_Year
                + "; isActive: " + Is_Active
                + "; logoImageName: " + Logo_Image_Name
                + "; sortOrder: " + Sort_Order)
    }
}

【问题讨论】:

    标签: json kotlin gson declaration


    【解决方案1】:

    您可以使用@SerializedName 标记Series 类的字段。例如

      @SerializedName("Series_Record_Name")
      val recordName: String
    

    【讨论】:

    • 此解决方案效果很好,但以下情况除外:var isActive: Boolean = seriesFirebase.Is_Active == 1。如何处理将 JSON 中的 Int 1/0 转换为类中的真/假,或者更复杂的东西,例如 JSON 中的字符串日期到类中的 LocalDate?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 2019-05-25
    • 2023-01-26
    • 2016-09-26
    • 1970-01-01
    相关资源
    最近更新 更多