Я пытаюсь проанализировать тело ошибки JSON со структурой
{
"code": 1,
"message": "Some error message"
}
При написании тестов для сценария, в котором message
отправляется как Int
, я ожидаю, что десериализация завершится ошибкой. Однако Моши преобразует тип Int
в String
. Ожидается ли такое поведение?
Вот неудачный тест для того же самого:
@Test
fun `network error with wrong types should not be parsed`() {
val errorResponseWithNoCode = """
{
"message": 123
}
""".trimIndent()
val result = NetworkErrorParser.parse(errorResponseWithWrongMessageType)
assertThat(result)
.isEqualTo(null)
}
NetworkErrorParser
довольно просто:
object NetworkErrorParser {
private val networkErrorAdapter by lazy {
Moshi.Builder().build().adapter(NetworkError::class.java)
}
/**
* Parses given string to [NetworkError].
*
* If JSON can't be parsed or is malformed, returns `null`.
* The caller is supposed to handle the error accordingly in such an event.
*/
fun parse(json: String): NetworkError? {
return try {
networkErrorAdapter.fromJson(json)
} catch (e: JsonDataException) {
null
} catch (e: JsonEncodingException) {
null
}
}
}
Такое поведение ожидаемо. Поскольку числа JSON имеют ограничения по точности, Moshi позволяет назначать числовые значения строковым свойствам, а строковые значения — числовым свойствам.
Например, вы можете заключить в кавычки такие значения, как «9007199254740993», чтобы защититься от потери точности с плавающей запятой.
Спасибо за помощь, Джесси, ценю это!