【问题标题】:JSONSerialization.jsonObject returns nilJSONSerialization.jsonObject 返回 nil
【发布时间】:2019-03-14 00:30:18
【问题描述】:
var responseString = String(data: data, encoding: .utf8)
var responseDict: [AnyHashable : Any]? = nil
if let anEncoding = responseString?.data(using: String.Encoding(rawValue: String.Encoding.utf8.rawValue)) {
   responseDict = try! JSONSerialization.jsonObject(with: anEncoding, options: .mutableContainers) as? [AnyHashable : Any]
}  

responseString 即将推出:

[{\"message_id\":1916,\"in_app\":{\"primary_color\":\"#333333\",\"secondary_color\":\"#ffffff\",\"position\ ":\"0\",\"持续时间\":\"30\",\"到期\":\"2018-11-07T23:17:46.169-05:00\",\"delay_minute\": \"0\",\"delay_second\":\"0\",\"message\":\"这个 是您的信息的样子!在文本中输入您的消息 区域并获得预览权 这里\",\"data\":{},\"deeplinkurl\":\"\",\"attachment-url\":\"\",\"title\":\"\",\" subtitle\":\"\"}},{\"message_id\":1920,\"in_app\":{\"primary_color\":\"#333333\",\"secondary_color\":\"#ffffff \",\"position\":\"0\",\"duration\":\"30\",\"expiry\":\"2018-11-08T03:52:15.404-05:00\" ,\"delay_minute\":\"0\",\"delay_second\":\"0\",\"message\":\"这个 是您的信息的样子!在文本中输入您的消息 区域并获得预览权 这里\",\"data\":{},\"deeplinkurl\":\"\",\"attachment-url\":\"\",\"title\":\"\",\"副标题\":\"\"}}]

responseDict 即将成为nil
对应的Objective-C 代码运行良好。

【问题讨论】:

  • 如果您使用 Swift 4,最好使用 Codable 协议
  • 那是因为[AnyHashable : Any] 是一个字典,但你的 JSON 是一个顶级数组。此外,避免使用 Swift 字典/数组的 .mutableContainers。还有String.Encoding(rawValue: String.Encoding.utf8.rawValue) => .utf8String.Encoding.utf8。应该够了。
  • @Larme 您应该将其发布为答案
  • @Scriptable 关于 Swift/Objective-C 中 JSON 解析的问题太多了,至少应该有一个重复,因为作者没有看到响应的顶级类型。
  • 如果你的变量不是编码,为什么你的变量叫做anEncoding

标签: ios swift jsonserializer


【解决方案1】:

这很好用……

let json = """
[{\"message_id\":1916,\"in_app\":{\"primary_color\":\"#333333\",\"secondary_color\":\"#ffffff\",\"position\":\"0\",\"duration\":\"30\",\"expiry\":\"2018-11-07T23:17:46.169-05:00\",\"delay_minute\":\"0\",\"delay_second\":\"0\",\"message\":\"This is what your message will look like! Type in your message in the text area and get a preview right here\",\"data\":{},\"deeplinkurl\":\"\",\"attachment-url\":\"\",\"title\":\"\",\"subtitle\":\"\"}},{\"message_id\":1920,\"in_app\":{\"primary_color\":\"#333333\",\"secondary_color\":\"#ffffff\",\"position\":\"0\",\"duration\":\"30\",\"expiry\":\"2018-11-08T03:52:15.404-05:00\",\"delay_minute\":\"0\",\"delay_second\":\"0\",\"message\":\"This is what your message will look like! Type in your message in the text area and get a preview right here\",\"data\":{},\"deeplinkurl\":\"\",\"attachment-url\":\"\",\"title\":\"\",\"subtitle\":\"\"}}]
""".data(using: .utf8)!

do {
    let object = try JSONSerialization.jsonObject(with: json, options: [])
    print(object)
} catch {
    print(error)
}

...但不要使用JSONSerialization...声明代表您的数据的自定义对象并改用Decodable

【讨论】:

  • 请注意,由于缺少as? Dictionary,因此该解决方案有效,与问题中的代码相反。 as? [[String: Any]] 也应该有工作。
猜你喜欢
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 2019-06-20
  • 2017-12-16
  • 2014-09-27
  • 2017-06-11
  • 2014-12-29
相关资源
最近更新 更多