当我尝试在swift中序列化json数据时,我会收到这个错误Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (__SwiftValue)'
以下是导致此问题的代码:
request.httpBody = try? JSONSerialization.data(withJSONObject: data, options: [])
我的数据变量看起来像这样:
let data = ["first_name": "John", "last_name": "Riverson", "post_info: userPost(title: "Some title", date_published: "some date")] as [String: Any]
我的问题是由userPost结构引起的,但我不确定如何修复它。
似乎userPost的结果不适用于JSON。
根据JSON系列化
可以转换为JSON的Foundation对象必须具有以下属性:
- 顶级对象是NSArray或NSDictionary
- 所有对象都是NSString、NSNumber、NSArray、NSDictionary或NSNull的实例
- 所有字典键都是NSString的实例
- 数字不是NaN或无穷大
如果你想让userPost可以被JSONSerialization接受,请参阅使用带有自定义类型的JSON,并对其应用Codable。
您的分析是正确的,它是由结构引起的。
根据JSONSerialization
:上的文件
可以转换为JSON的Foundation对象必须具有以下属性:
- 顶级对象是NSArray或NSDictionary
- 所有对象都是NSString、NSNumber、NSArray、NSDictionary或NSNull的实例
- 所有字典键都是NSString的实例
- 数字不是NaN或无穷大
参考:https://developer.apple.com/documentation/foundation/jsonserialization
因此,您需要将结构转换为dictionary才能将其插入此处。
类似于:
let userPostDict: [String:Any] = //... your logic e.g. userPost.toDictionary
let data = ["first_name": "John",
"last_name" : "Riverson",
"post_info" : userPostDict]
您可以在userPost
结构中有一个toDictionary
计算属性,该属性将为您提供[String:Any]
示例:
extension YourStruct {
var toDictionary: [String:Any] {
//make the dictionary & return here
}
}