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

3b6akqbq  于 2022-11-06  发布在  其他
关注(0)|答案(3)|浏览(163)

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

waxmsbnn

waxmsbnn1#

我对Kotlin了解不多,但我知道你可以很好地混合Java和Kotlin,既然Gson是为Java使用而设计的,我认为你应该使用Java。你可以创建一个Java类,然后创建一个如下所示的方法:

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

然后从Kotlin调用该方法。
我并不是说你应该用Java来完成整个项目,只是用Java来实现这个方法。
希望这能有所帮助,如果这不是你想的,请告诉我:)

bxjv4tth

bxjv4tth2#

我刚刚使用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版本,也用它写一个单元测试。

polkgigr

polkgigr3#

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

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?
)

相关问题