ios - 无法将数据转换为字典
问题描述
我有一个 JSONObject,我想将它转换为它的类。
我尝试使用 JSONSerialization.data(withJSONObject: data, options: [] 并将其编码为 .utf8 String 但没有成功......
socket.on("privateMessage") {data, ack in
print("privateMessage :\(data[0])");
guard let jsonData = try? JSONSerialization.data(withJSONObject: data, options: []) else {return}
结果:
(lldb) po data
▿ 1 element
- 0 : {"emisor":105,"receptor":54,"receptor_token":"7ec66175309aac4cbeda0c9936991cfdfcad8445fdcff583524d940c7e0ee4669488675c214823e0","texto":"Dshfljkhdlsafh","updated_at":"2019-06-20 16:38:30","created_at":"2019-06-20 16:38:30","id":10056,"time":"16:38:30"}
(lldb) po jsonData
▿ 282 bytes
- count : 282
▿ pointer : 0x00007f917289f000
- pointerValue : 140262668627968
解决方案
这是一种非常不寻常的响应格式,从注释中的输出来看,它是一个未指定的数组 ( [Any]
),其中包含一个 JSON 字符串,如下所示
let json = """
{"emisor":105,"receptor":54,"receptor_token":"6b6295e0b0601146e56ff4a9caec287f0ecc0f385fcfcd758dccd00c6385c558eefc6d6fbe98e977","texto":"Blanca bla","updated_at":"2019-06-21 10:48:22","created_at":"2019-06-21 10:48:22","id":10074,"time":"10:48:22"}
"""
let data : [Any] = [json]
首先为了方便声明一个结构
struct Response: Decodable {
let emisor, receptor, id: Int
let receptorToken, texto, updatedAt, createdAt, time: String
}
解析 JSON 检查是否data
是一个数组,如果数组中有一个字符串,成功时将其转换为Data
并解码Decodable
socket.on("privateMessage") {data, ack in
if let response = data as? [Any], let jsonString = response.first as? String {
let jsonData = Data(jsonString.utf8)
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let result = try decoder.decode(Response.self, from: jsonData)
print(result)
} catch {
print(error)
}
}
}
推荐阅读
- postgresql - 在 PostgreSQL 中为带前缀的表创建索引
- javascript - JavaScript:用户关闭横幅并且在接下来的 30 天内不显示横幅
- java - XSLT 无法将样式表附加到 XML
- json - 如何将正文(ByteBuffer)解码为 Vapor 4 中的内容?
- javascript - 太多的重新渲染。React 限制了渲染的数量以防止无限循环。使用状态问题?
- django - Django 多个数据库......尽管路由器,所有模型都是在第二个数据库中创建的,我的路由器不是很好吗?
- python - contourf 不显示没有颜色条的级别范围之外的颜色
- spring - 移除jackson-jaxrs时RequestMappingHandlerMapping的BeanCreationException
- kotlin - 在 kotlin 中使用反射获取泛型类型的静态字段的值
- mapstruct - 如果存在且不为空,如何更新嵌套对象