解析\ n(带引号的)字符串

时间:2019-01-04 14:44:50

标签: json swift codable jsondecoder

我对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。})))

有没有办法解决这个问题?

1 个答案:

答案 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)!