JSONSerialization仅在新的ios模拟器上崩溃

时间:2017-07-25 15:51:27

标签: ios swift3 simulator

let params = ["first":"string", "second":["any":""]] as [String: Any]
let serverUrl = URL(string: "https://example.execute-api.ap-southeast-2.amazonaws.com/prod")!
var request = URLRequest(url:serverUrl)
request.httpMethod = "POST"
request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.setValue("secret", forHTTPHeaderField: "X-Api-Key")
do {
    request.httpBody = try JSONSerialization.data(withJSONObject: params, options: [])
} catch _ as NSError {
    return
}

这在第8行的新ios模拟器上崩溃了,但是当再次尝试工作时。我测试了不同的假设,但似乎无法找出原因。

我测试过了:

  1. isValidJsonObject()
  2. 混合嵌套字典
  3. 空字符串
  4. Dictionary'<'String,Any> vs [String:Any]
  5. 崩溃错误消息是'Thread 1:EXC_BAD_ACCESS(code = EXC_i386_GPFLT)'。我已经检查了线程是否有任何错误,但是我的中央调度似乎正在以正确的顺序输出正确的数据。

    任何线索?

    此问题仅限于模拟器还是会出现在物理ipad中?

    编辑:进一步的谷歌搜索表明这是一个问题,空字符串以某种方式有助于返回零。我可以将空字符串强制为空值,但是我仍然感到困扰的是,上面的代码只能在一个新的模拟器中崩溃,但之后可以完美地运行。

1 个答案:

答案 0 :(得分:0)

好吧,也许你需要用你的参数编码你的urlRequest。首先,您必须将字典转换为[String : Any],然后编辑您的编码。例如,您可以这样做:

let params : [String : Any] = ["first":"string", "second":["any:""]]
do {
        request = try URLEncoding.default.encode(urlRequest, with: params)
    } catch _ as NSError {
        return
    }

现在,如果您的请求有POST或PUT方法,您必须通过http正文和标题指定您的设置:

urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters, 
                                                 options: [.prettyPrinted])