Kotlin Gson нулевое значение - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь сформировать этот тип JSON:

"answer_id":123,
"question_id":4567,
"value":"null"

Однако я не могу поместить значение NULL в ключ значения, похоже, что Gson просто игнорирует это поле, поэтому после сериализации я получаю

"answer_id":123,
"question_id":4567

, поэтому мой сервер выдает неверный запрос.Я использую serializeNulls() в Gson Builder, который должен разрешать обнуляемые значения, но он не работает для меня.Кто-нибудь знает в чем проблема?

@Parcelize
data class AnswerHelperObject(@SerializedName("question_id") val questionId: Int,
                              @SerializedName("value") val value: String? = null,
                              @SerializedName("answer_id") val answerId: Int?)

    : Parcelable {}

1 Ответ

0 голосов
/ 18 февраля 2019

Поскольку вы получаете значение в виде строки, Gson будет анализировать его как строку «null», вы можете написать собственные десериализаторы, если хотите, чтобы значение поля было нулевым.

AnswerHelperObject

data class AnswerHelperObject(
    var answer_id: Int,
    var question_id: Int,
    var value: String?
)

AnswerHelperObjectDeserializer

class AnswerHelperObjectDeserializer: JsonDeserializer<AnswerHelperObject>{
    override fun deserialize(json: JsonElement, typeOfT: Type?, context: JsonDeserializationContext?): AnswerHelperObject {
        val answerHelperObject = Gson().fromJson(json.asJsonObject, AnswerHelperObject::class.java)
        if (answerHelperObject.value == "null") {
            answerHelperObject.value = null
        }
        return answerHelperObject
    }
}

Вы можете увидеть тестовые сценарии.

class AnswerHelperObjectTest {

    @Test
    fun answer_object_parse_as_null_string() {
        val json = "{\"answer_id\":123,\n" +
                "\"question_id\":4567,\n" +
                "\"value\":\"null\"}"

        val answerHelperObject = Gson().fromJson(json, AnswerHelperObject::class.java)
        // value is parsed as string of value null
        assertEquals(answerHelperObject.value, "null")
    }
    @Test
    fun answer_object_parse_null() {
        val json = "{\"answer_id\":123,\n" +
                "\"question_id\":4567,\n" +
                "\"value\":\"null\"}"

        val gson = GsonBuilder()
            .registerTypeAdapter(AnswerHelperObject::class.java, AnswerHelperObjectDeserializer())
            .create()

        val answerHelperObject = gson.fromJson(json, AnswerHelperObject::class.java)
        // value is deserialized as null
        assertEquals(answerHelperObject.value, null)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...