Swift使用JSONSerialization处理HealthKit的FHIR数据提示无效JSON
问题原因与解决方法
核心原因
- 对
JSONSerialization.isValidJSONObject(_:)的作用认知错误:该方法的校验对象是已解析完成的Foundation类型对象(仅支持字典、数组、字符串、数字、NSNull这几类JSON兼容类型),用来判断对象是否可以被序列化为合法JSON数据,不能直接用来校验原始Data类型的FHIR数据,直接传入Data类型必然返回false。 - 你看到的打印内容不是原始JSON结构:控制台输出的是解析后得到的
NSDictionary对象的调试描述格式,属于苹果自定义的调试输出规则,用=替代JSON的:、()替代JSON的[]、末尾带分号都是调试格式的特征,和原始JSON是否合法没有关联。 - 如果已传入解析后的对象调用该方法仍返回false,说明解析结果里包含JSON不支持的类型(比如日期对象、自定义类实例等),你看到的中文弯引号是控制台打印的转义效果,不属于原始数据的问题。
解决方法
场景1:校验原始FHIR Data是否为合法JSON
直接通过JSONSerialization的解析方法捕获异常判断即可,不需要调用isValidJSONObject:
do { let jsonObject = try JSONSerialization.jsonObject(with: fhirRecord.data, options: []) // 无异常抛出即代表原始Data是合法JSON,解析成功 print("FHIR数据解析成功") } catch { print("JSON解析失败,错误信息:\(error.localizedDescription)") }
场景2:需要把解析后的对象转回标准JSON数据
确认解析结果根节点是字典/数组后,可直接调用序列化方法,也可提前通过isValidJSONObject做分支判断:
do { // 第一步:解析原始FHIR数据 let fhirJsonObject = try JSONSerialization.jsonObject(with: fhirRecord.data, options: []) // 第二步:校验对象是否支持序列化回JSON guard JSONSerialization.isValidJSONObject(fhirJsonObject) else { print("解析后的对象不符合JSON序列化要求") return } // 第三步:序列化为标准JSON Data let standardJsonData = try JSONSerialization.data(withJSONObject: fhirJsonObject, options: .prettyPrinted) // 可选:转成字符串查看标准JSON格式 if let jsonStr = String(data: standardJsonData, encoding: .utf8) { print("标准JSON内容:\n\(jsonStr)") } } catch { print("操作失败:\(error.localizedDescription)") }
内容的提问来源于stack exchange,提问作者cole
相关产品推荐
相关产品推荐

