【问题标题】:JSONSerialization error in swift3swift3中的JSON序列化错误
【发布时间】:2017-05-17 07:27:43
【问题描述】:

我正在尝试将音频文件发布到 API,但出现错误 “*** 由于未捕获的异常‘NSInvalidArgumentException’而终止应用程序,原因:‘JSON 写入 (NSURL) 中的类型无效’” 这是我的代码:

    let parameters = [fileUrl]

    //create the url with NSURL
    let url = NSURL(string: "httpblahblah")

    //create the session object
    let session = URLSession.shared

    //now create the NSMutableRequest object using the url object
    let request = NSMutableURLRequest(url: url! as URL)
    request.httpMethod = "POST" //set http method as POST

    do {
        request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted) // pass dictionary to nsdata object and set it as request body

    } catch let error {
        print(error.localizedDescription)
    }

    //HTTP Headers
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")

    //create dataTask using the session object to send data to the server
    let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in

        guard error == nil else {
            return
        }

        guard let data = data else {
            return
        }

        do {
            //create json object from data
            if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: AnyObject] {
                print(json)
                // handle json...
            }

        } catch let error {
            print(error.localizedDescription)
        }

    })

    task.resume()

【问题讨论】:

  • 我建议您使用此功能,您可以使用 alamofire 第三方库

标签: json swift


【解决方案1】:

当您创建request.httpBody 时,您将传入您在上面声明的parameters 数组:

let parameters = [fileUrl]

从您的代码中不清楚,但如果 fileUrlNSURL 而不是 String,则会导致您看到的错误。 JSONSerialization 的文档说:

所有对象都是 NSString、NSNumber、NSArray、 NSDictionary 或 NSNull。

所以试图潜入 NSURL 肯定行不通。

假设您的意图是将fileUrl 序列化为String,您可以通过将声明更改为:

let parameters = [fileUrl.absoluteString!]

如果您想发送实际的文件数据,您将无法在 JSON 对象中对其进行序列化。查看this question 及其答案,了解从文件向服务器发送数据的一个很好的示例。根据您使用的 API,您可能仍需要 JSON 对象来存储其他数据,其结构将由 API 确定。

【讨论】:

  • 我有音频文件,并且有系统路径。我应该先将其转换为数据吗?
【解决方案2】:

据我了解,您正在尝试上传带有URL 参考而不是Data 的音频文件。 从 URL 中获取正确的数据格式:

let data = FileManager.default.contents(atPath: fileUrl.path)
request.httpBody = data

【讨论】:

  • 我的回答有什么问题?您试图从 URL 序列化 json。这不可能。如果您需要一种不同的方式从本地 URL 获取数据,那么这不是我的不正确
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 2018-07-28
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多