Swift在序列化数据时显示错误



当我尝试在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
}
}

相关内容

最新更新