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 转换问题

Swift JSONSerialization.data 崩溃

Swift JSONSerialization.jsonObject 错误