【问题标题】:Ktor String response cannot be converted to JSONObjectKtor 字符串响应无法转换为 JSONObject
【发布时间】:2021-05-06 02:51:17
【问题描述】:

我刚刚在我的原生 android 应用程序中从 volley requests 转移到 ktor。 现在我遇到了问题,字符串响应无法转换为 JSONObject。

有一个像这样的简单类(我稍微缩短了一点):

data class LoginResult(
    val success: Boolean,
    val token : String,
    val userId: UUID?,
    val tokenExpirationTime: LocalDateTime?
)
{
    companion object {
        fun fromJson(json: String) : LoginResult{
            val obj = JSONObject(json)

            var userId: UUID? = UUID.fromString(obj.getString("userId"))
            var expirationTime: LocalDateTime.parse(obj.getString("expiration"), DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss"))

            return LoginResult(
                obj.getBoolean("success"),
                obj.getString("token"),
                userId,
                expirationTime
            )
        }
    }
}

我的请求是这样的:

val client = HttpClient(CIO)
val response = client.post<String> {
                 url(Url.RefreshLogin)
                 addDefaultHeaders(this)
               }
val loginResult = LoginResult.fromJson(response)

运行该代码时,我遇到了这个异常:

org.json.JSONException: 值 {\"success\":true,\"token\":\"myToken\",\"userId\":\"2e181dac-416d-4668-b647-762e6596962a\" ,\"expiration\":\"2022.02.01 22:15:12\"} 类型的 java.lang.String 无法转换为 JSONObject

后端没有变化,之前截击请求运行良好。

有什么建议吗?

【问题讨论】:

    标签: android kotlin ktor


    【解决方案1】:

    发现响应字符串的开头和结尾都有引号。 当我用response.substring(1, response.length - 1) 切断它们时,我又遇到了一个错误:

    {\"success\"...的字符 1 处的预期文字值...

    问题是,库错误地转义了 json 中的引号。 所以我替换了转义字符。

    工作解决方案:

    var fixedJson = response.substring(1, response.length - 1)
    fixedJson = fixedJson.replace("\\\"", "\"")
    
    val loginResult = LoginResult.fromJson(fixedJson )
    

    【讨论】:

      猜你喜欢
      • 2021-11-15
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 2017-01-27
      • 2017-09-01
      • 1970-01-01
      相关资源
      最近更新 更多