如果响应中的字段类型错误,Square Moshi 将 Int 转换为 String

Square Moshi casts Int to String if field type is wrong in response

我正在尝试用结构

解析JSON错误正文
{
    "code": 1,
    "message": "Some error message"
}

在为 message 作为 Int 发送的场景编写测试时,我预计反序列化会失败。但是,Moshi 将 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”这样的值来防止浮点精度丢失。