Swift - JSONSerialization 无效的 JSON
Posted
技术标签:
【中文标题】Swift - JSONSerialization 无效的 JSON【英文标题】:Swift - JSONSerialization invalid JSON 【发布时间】:2021-09-10 17:48:48 【问题描述】:我正在通过HealthKit
访问健康记录,问题是当我检查FHIR
数据时,使用isValidJSONObject
检查时它不是有效的JSON 数据。我对JSONSerialization
不太熟悉,这是我第一次真正使用它。
let jsonObject = try JSONSerialization.jsonObject(with: fhirRecord.data, options: [])
print(jsonObject)
lotNumber = 11111;
occurrenceDateTime = "2021-01-01”;
patient =
reference = "resource:0";
;
performer = (
actor =
display = “Some place here“;
;
);
resourceType = Immunization;
status = completed;
vaccineCode =
coding = (
code = 1;
system = “URL_HERE”;
,
code = 28581000087106;
system = “URL_HERE”;
);
;
【问题讨论】:
您能否展示您如何尝试验证 JSON 以及打印错误的位置?既然你成功打印了jsonObject
,那么实际上解析成功了。
所以你在jsonObject
上测试了isValidJSONObject
?因为isValidJSONObject
是来自(NS)Dictionary
/(NS)Array
要知道它是否可以是(NS)Data
。请参阅***.com/questions/40635993/… 目前,它正确解析了fhirRecord.data
,您有NSDictionary
的打印。你期待什么?如果您期望更多的“JSON 字符串”,那么您想要的是 let jsonStr = String(data fhirRecord.data, encoding: .utf8)
...
啊,谢谢指正!我正在寻找let jsonStr = String(data fhirRecord.data, encoding: .utf8)
。我正在寻找创建一些 Codable
数据
【参考方案1】:
JSONSerialization 与 Codable 无关,通常在 Swift 中应避免使用。它只存在于 Swift 中,因为它是从 ObjC 桥接的,并且即使在 ObjC 中也有很大的限制。
isValidJSONObject
不会告诉您 JSON 数据是有效的。它告诉您可以通过 JSONSerialization 将 ObjC 对象转换为 JSON(同样,与 Codable 完全无关)。
摆脱 JSONSerialization。将您的 JSON 插入 https://app.quicktype.io 为其生成 Codable 模型,并使用 JSONDecoder 对其进行解码。 JSONSerialization 只会给出一个[String: Any]
,这在 Swift 中非常难以使用(在 ObjC 中不是很好)。 JSONDecoder 会给你一个合适的结构。
【讨论】:
这就是我的目标,但就像我说的 FHIR 数据有点不同。我在正确的道路上,还没有,但一些答案确实帮助了我。 更复杂的 JSON 使用 JSONDecoder 仍然非常可解析。你不能总是使用 app.quicktype.io,特别是如果键是动态的,但 Decodable 可以处理各种不寻常的结构。也就是说,Apple 有一个专门用于 FHIR 结构的包,我会看看:github.com/apple/FHIRModels 完美,这似乎更符合我的要求! 您可以在以下 WWDC 演讲中了解有关 Health Records API 和 FHIRModel 的更多信息:WWDC18:developer.apple.com/videos/play/wwdc2018/706 和 WWDC20:developer.apple.com/videos/play/wwdc2020/10669【参考方案2】:正如@RobNapier 指出的,我需要来自 Apple 的 FHIRModels
。与手动使用凌乱的Codable
数据方法相比,我能够更轻松地获取数据。
import ModelsR4
let resource = try decoder.decode(Immunization.self, from: data)
打印输出正确
28581000087106
28581000087106
【讨论】:
以上是关于Swift - JSONSerialization 无效的 JSON的主要内容,如果未能解决你的问题,请参考以下文章
Swift - JSONSerialization 无效的 JSON
Swift 3 JSONSerialization 序列化字典包含 \ 字符
swift 4 timeIntervalSinceReferenceDate 而不是 JSONSerialization 之后的实际日期字符串
JSONSerialization AnyObject SWIFT3 转换问题