繁体   English   中英

gson.toJson 为数据类返回一个空对象

[英]gson.toJson returns an empty object for a data class

我有一个 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)

有人可以建议我在哪里做错了吗

非常感谢您的帮助

谢谢R

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

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

然后从 Kotlin 调用该方法。

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

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

我刚刚使用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 版本并使用它编写单元测试。

可能您为 gson 设置了new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()设置。 如果是这样,您只需将@Expose注释添加到要在 json 中序列化的每个字段:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM