gpt4 book ai didi

ios - 解码在字符串中转义的JSON对象

转载 作者:行者123 更新时间:2023-12-01 21:58:47 24 4
gpt4 key购买 nike

我从API收到响应(不幸的是,我无法更改它),看起来像(只是一个例子):

作为字节=> "{\"key\":\"value\"}"
开头和结尾的引号以及转义的引号都是响应的一部分,我以一种非常丑陋的方式解决它,如下所示:

// (...) Receiving response

guard var responseString = String(bytes: data, encoding: .utf8) else {
print("Response wasn't just a string, great!") // unfortunately, this never happens
return
}
responseString = responseString.trimmingCharacters(in: .whitespacesAndNewlines) // make sure it is trimmed
responseString = String(responseString.dropFirst()) // drop the quote at the start
responseString = String(responseString.dropLast()) // drop the quote at the end
responseString = responseString.replacingOccurrences(of: "\\\"", with: "\"")// convert all \" to " (and hope nothing else is escaped <<< this is really bad!!!)
let responseDataToDecode = responseString.data(using: .utf8)!

// (...) decoding with JSONDecoder

有没有一种方法可以自动取消转义字符串并使用其中包含的JSON对象?

最佳答案

如果是双重编码,那么您只需要进行双重解码即可。如果我理解正确,则传入的数据是这样的:

let str = #""{\"key\":\"value\"}""#
// "{\\"key\\":\\"value\\"}"

第一个字节为 ",第二个字节为 {,第三个字节为 \,第四个字节为 "

这是一个JSON编码的字符串。因此,将其解码为字符串(有时会因为它是“片段”而无法使用,但目前至少在我所有的测试中都可以正常工作):
let decoder = JSONDecoder()
let string = try! decoder.decode(String.self, from: Data(str.utf8)) // {"key":"value"}

然后将其解码为您的类型(例如 [String:String]):
let result = try! decoder.decode([String:String].self, from: Data(string.utf8))
// ["key": "value"]

(IMO,这种双重编码很好,顺便说一句,我不确定为什么有这么多的注释反对。在许多情况下,序列化任意对象比强制模式处理任意结构更有意义。只要编码干净,我就看不到任何问题。)

关于ios - 解码在字符串中转义的JSON对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60743348/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com