首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当JSON使用数组对Swift对象进行编码时,出现异常“Invalid type in JSON write (__SwiftValue)”

当JSON使用数组对Swift对象进行编码时,出现异常“Invalid type in JSON write (__SwiftValue)”
EN

Stack Overflow用户
提问于 2019-12-02 10:16:10
回答 1查看 700关注 0票数 0

尝试将此Swift对象编码为JSON时获取异常*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (__SwiftValue)'。所有非可选成员,对象可编码。什么是正确的编码方式,或者应该使用一些第三方库?

代码语言:javascript
运行
复制
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
    }

    ...
}
EN

回答 1

Stack Overflow用户

发布于 2019-12-02 12:56:10

问题是您使用的是JSONSerialization而不是JSONEncoderJSONSerialization是一种更老的基础/Objective-C写对象方式。它仅适用于基础对象(有关完整列表,请参阅documentation )。

相反,您应该使用JSONEncoder。棘手的部分是,如果您不做一些工作,JSONEncoder就不能直接编码Dictionary。有几种方法可以解决这个问题,但是如果这是您唯一要使用的JSON格式,我可能只需要使用CodingKeys为您的结构创建自定义键。

代码语言:javascript
运行
复制
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
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59131842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档