序列化 Swift 4.2 中输出不一致的 JSON 读取选项



我正在做一个宠物项目,我正在使用JSONSerialization类和jsonObject(with:options:)序列化JSON。该对象在转换为字典[String: Any]或数组[Any]之前不可用。这是发生不一致的地方。以下是我的一个类的方法。输入经过测试且有效。

private static func parse(data: Data) -> [JSONDictionary]? {
do {
let options = JSONSerialization.ReadingOptions() // rawValue = UInt 0
let otherOptions: JSONSerialization.ReadingOptions = [] // rawValue = UInt 0
let jsonAny = try JSONSerialization.jsonObject(with: data, options: otherOptions)
if let array = jsonAny as? [String: Any] {
print(array)
}
} catch {
return nil
}
return nil
}

这两个ReadingOption对象都是有效的,并生成可以正确转换的有效输出,并调用print(array)

但是,当我使用以下内容时,会返回无效的输出,并且无法正确转换。注意jsonObject调用中的options与上述示例中的otherOptions具有等效值。

private static func parse(data: Data) -> [JSONDictionary]? {
do {
let jsonAny = try JSONSerialization.jsonObject(with: data, options: [])
if let array = jsonAny as? [String: Any] {
print(array) // never called
}
} catch {
return nil
}
return nil
}

我想因为它们具有等效的值,所以我可以用它们来代替彼此。但事实并非如此。这是一个错误,还是我用错了?

编辑:这是正在使用的数据集 https://www.govtrack.us/api/v2/role?current=true&role_type=senator

阅读选项无关紧要。在 Swift 中,只有当预期结果不是数组或字典时,ReadingOptions才有用。

如果预期类型是数组或字典,则省略options参数

不一致的是你的返回类型是一个数组([JSONDictionary](,但实际类型是一个字典。

private static func parse(data: Data) -> JSONDictionary? {
do {
let jsonAny = try JSONSerialization.jsonObject(with: data)
if let jsonDictionary = jsonAny as? JSONDictionary {
return jsonDictionary 
}
} catch {
print(error)
return nil
}
return nil
}

建议交出投掷方法的错误

enum SerializationError : Error {
case typeMismatch
}
private static func parse(data: Data) throws -> JSONDictionary {
let jsonAny = try JSONSerialization.jsonObject(with: data)
guard let jsonDictionary = jsonAny as? JSONDictionary else { throw SerializationError.typeMismatch }
return jsonDictionary 
}

最新更新