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 )
我刚刚在我的原生 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 )