#java #android #json #kotlin #gson
#java #Android #json #kotlin #gson
Вопрос:
У меня есть класс данных kotlin OfflineDataRequestInfo
, который я хочу преобразовать в Json с помощью Gson, но он всегда возвращает пустой объект
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
Ответ №1:
Возможно, у вас есть new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()
настройка для gson. Если это так, вам просто нужно добавить @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?
)
Ответ №2:
Я не так много знаю о Kotlin, но я знаю, что вы можете довольно хорошо смешивать Java и Kotlin, и поскольку Gson был создан с учетом использования Java, я думаю, вам следует использовать Java. Вы можете создать класс Java, а затем метод, подобный этому:
String toJson(OfflineDataRequestInfo o) {
return new Gson().toJson(o, OfflineDataRequestInfo.class);
}
а затем вызовите этот метод из Kotlin .
Я не говорю, что вы должны выполнять весь свой проект на Java, просто используйте Java для этого одного метода.
Надеюсь, это поможет, и, пожалуйста, скажите мне, если это было не то, что вы имели в виду 🙂
Ответ №3:
Я только что протестировал следующий код, используя 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, а также написать модульный тест с ее использованием.