尝试将此Swift对象编码为JSON时获取异常*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (__SwiftValue)'
。所有非可选成员,对象可编码。什么是正确的编码方式,或者应该使用一些第三方库?
struct MediaItem: Codable {
var key: String = ""
var filename: String = ""
}
struct NoteTask: Codable {
var id: String = ""
var notes: String = ""
var mediaList: [MediaItem] = []
}
static func addTask(task: NoteTask, callback: @escaping TaskAPICallback) {
let configuration = URLSessionConfiguration.default
let session = URLSession(configuration: configuration)
let url = URL(string: postUrl)
var request : URLRequest = URLRequest(url: url!)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
let params: [String: Codable?] = [
"email": task.id,
"notes": task.notes,
"fileList": task.fileList
]
do {
request.httpBody = try JSONSerialization.data(withJSONObject: params, options: [])
} catch {
DispatchQueue.main.async {
callback(false)
}
return
}
...
}
发布于 2019-12-02 12:56:10
问题是您使用的是JSONSerialization
而不是JSONEncoder
。JSONSerialization
是一种更老的基础/Objective-C写对象方式。它仅适用于基础对象(有关完整列表,请参阅documentation )。
相反,您应该使用JSONEncoder
。棘手的部分是,如果您不做一些工作,JSONEncoder
就不能直接编码Dictionary
。有几种方法可以解决这个问题,但是如果这是您唯一要使用的JSON格式,我可能只需要使用CodingKeys
为您的结构创建自定义键。
struct MediaItem: Codable {
var key: String = ""
var filename: String = ""
}
struct NoteTask: Codable {
var id: String = ""
var notes: String = ""
var mediaList: [MediaItem] = []
enum CodingKeys: String, CodingKey {
case id = "email"
case notes = "notes"
case mediaList = "fileList"
}
}
static func addTask(task: NoteTask, callback: @escaping TaskAPICallback) {
let configuration = URLSessionConfiguration.default
let session = URLSession(configuration: configuration)
let url = URL(string: postUrl)
var request : URLRequest = URLRequest(url: url!)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
do {
request.httpBody = try JSONEncoder().encode(task)
} catch {
DispatchQueue.main.async {
callback(false)
}
return
}
}
https://stackoverflow.com/questions/59131842
复制相似问题