我对Codable解析有问题...这是我的示例代码:
class Test: Codable {
let resultCount: Int?
let quote: String?
}
var json = """
{
"resultCount" : 42,
"quote" : "My real quote"
}
""".data(using: .utf8)!
var decoder = JSONDecoder()
let testDecoded = try! decoder.decode(Test.self, from: json)
这里一切正常,并创建了Test对象。
现在,我的后端向我发送带有中间引号的引号字符串……这种形式(请注意 \“ real \” ):>
class Test: Codable {
let resultCount: Int?
let quote: String?
}
var json = """
{
"resultCount" : 42,
"quote" : "My \"real\" quote"
}
""".data(using: .utf8)!
var decoder = JSONDecoder()
let testDecoded = try! decoder.decode(Test.self, from: json)
在第二种情况下,解码器无法创建对象...而这是我的错误消息:
dataCorrupted(Swift.DecodingError.Context(codingPath:[], debugDescription:“给定的数据不是有效的JSON。”, 底层错误:可选(错误域= NSCocoaErrorDomain代码= 3840 “对象4周围的对象中没有值的字符串键。” UserInfo = {NSDebugDescription =对象周围的值没有字符串键 字符4。})))
有没有办法解决这个问题?
答案 0 :(得分:2)
要在JSON中包含引号,字符串中的引号之前必须包含实际的\
字符:
{
"resultCount" : 42,
"quote" : "My \"real\" quote"
}
要在Swift字符串文字中执行此操作,您需要对\
进行转义。这样会在Swift多行字符串文字中产生"My \\"real\\" quote"
:
let json = """
{
"resultCount" : 42,
"quote" : "My \\"real\\" quote"
}
""".data(using: .utf8)!
let decoder = JSONDecoder()
let testDecoded = try! decoder.decode(Test.self, from: json)
但是,如果要处理标准的非多行字符串文字,则需要同时使用反斜杠和引号,从而使\"My \\\"real\\\" quote\"
看起来更加混乱:
let json = "{\"resultCount\": 42, \"quote\" : \"My \\\"real\\\" quote\"}"
.data(using: .utf8)!