【问题标题】:gson.toJson returns an empty object for a data classgson.toJson 为数据类返回一个空对象
【发布时间】:2020-10-15 00:57:59
【问题描述】:

我有一个 kotlin 数据类 OfflineDataRequestInfo 我想使用 Gson 将其转换为 Json,但它总是返回一个空对象

data class OfflineDataRequestInfo (
    @SerializedName("status") val status: String,
    @SerializedName("userId") val userId: String?,
    @SerializedName("fulOrderId") val fulOrderId: String,
    @SerializedName("timeStamp") val timeStamp: String,
    @SerializedName("fulOrder") val fulOrder: String,
    @SerializedName("checks") val checks: String?
)

一些值可能为空,所以我也尝试了返回{}的波纹管代码

gson.toJson(OfflineDataRequestInfo("a","b","c","d", "e", "f"))

这里有更多信息,以防万一出现问题

@Entity
data class OfflineData (
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    @ColumnInfo(name="request_code") val requestCode: String?,
    @Embedded
    val requestInfoJson: OfflineDataRequestInfo
)

这是我的实际功能

fun postFulOurderData(offlineData: OfflineData) {
    if (offlineData != null) {
        val mainRepository = MainRepository(ApiHelper(RetrofitBuilder.apiService))
        val builder = GsonBuilder()
        builder.serializeNulls()
        val gson = builder.create()
        launch {

            val postFulOrder = mainRepository.postFulOrderOfflineData(gson.toJson(offlineData.requestInfoJson), tokenResult.access_token)
        }
    }
}

我也尝试使用如上所示的 GsonBuilder 以及默认的 Gson,但没有运气

也试过gson.toJson(offlineData.requestInfoJson, OfflineDataRequestInfo::class.java)

谁能建议我哪里做错了

非常感谢您的帮助

谢谢 回复

【问题讨论】:

    标签: java android json kotlin gson


    【解决方案1】:

    我对 Kotlin 了解不多,但我知道你可以很好地混合使用 Java 和 Kotlin,而且由于 Gson 是在考虑使用 Java 的情况下制作的,所以我认为你应该使用 Java。您可以创建一个 Java 类,然后是这样的方法:

    String toJson(OfflineDataRequestInfo o) {
        return new Gson().toJson(o, OfflineDataRequestInfo.class);
    }
    

    然后从 Kotlin 调用该方法。

    我并不是说你应该用 Java 来完成你的整个项目,只是使用 Java 来实现这一方法。

    希望这会有所帮助,如果这不是您的想法,请告诉我:)

    【讨论】:

      【解决方案2】:

      我刚刚使用gson:2.2.4 测试了以下代码,它可以工作:

      data class OfflineDataRequestInfo (
              @SerializedName("status") val status: String,
              @SerializedName("userId") val userId: String?,
              @SerializedName("fulOrderId") val fulOrderId: String,
              @SerializedName("timeStamp") val timeStamp: String,
              @SerializedName("fulOrder") val fulOrder: String,
              @SerializedName("checks") val checks: String?
      )
      
      fun main() {
          println(Gson().toJson(OfflineDataRequestInfo("a","b","c","d", "e", "f")))
      }
      

      输出: {"status":"a","userId":"b","fulOrderId":"c","timeStamp":"d","fulOrder":"e","checks":"f"}

      我没有在 android 上尝试过,但它应该也可以。 我建议您尝试更新您的 gson 版本并使用它编写单元测试。

      【讨论】:

        猜你喜欢
        • 2017-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-31
        • 2014-07-15
        • 2018-08-25
        • 2020-10-31
        • 1970-01-01
        相关资源
        最近更新 更多