Ktor String 响应无法转换为 JSONObject

Ktor String response cannot be converted to JSONObject

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

得到一个简单的 class 像这样(我稍微缩短):

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

后端没有变化,之前的 volley 请求工作正常。

有什么建议吗?

发现响应字符串的开头和结尾都有引号。 当我用 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 )