【问题标题】:Unreadable JSON answer in SwiftSwift 中不可读的 JSON 答案
【发布时间】:2019-07-15 04:23:54
【问题描述】:

我正在使用此代码向 api 发送发布请求:

@IBAction func loadServicesTestButton(_ sender: UIButton) {

        DispatchQueue.main.async {

            let headers = [
                "content-type": "application/x-www-form-urlencoded",
                "cache-control": "no-cache",
                "postman-token": "dded3e97-77a5-5632-93b7-dec77d26ba99"
            ]
            let postData = NSMutableData(data: "data={\"user_id\":\"1\",\"type_id\":\"2\"}".data(using: String.Encoding.utf8)!)
            let request = NSMutableURLRequest(url: NSURL(string: "http://www.api.com")! as URL,
                                              cachePolicy: .useProtocolCachePolicy,
                                              timeoutInterval: 10.0)
            request.httpMethod = "POST"
            request.allHTTPHeaderFields = headers
            request.httpBody = postData as Data

            let session = URLSession.shared
            let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
                if (error != nil) {
                    print(error!)
                } else {
                    if let dataNew = data, let responseString = String(data: dataNew, encoding: .utf8) {
                        print(responseString)                        

                    }

                }

            })

            dataTask.resume()
        }

    }

作为回答,我得到了这样的不可读的 JSON:

{"status":"ok","answer":{"address":"\u041a\u0430\u043c\u044b\u0448\u0438, \u0434\u043e\u043c 98","created_at":"2019-02-12 12:48:24","updated_at":"2019-02-21 08:58:30","name":"\u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440 \u041a\u0443\u0437\u044c\u043c\u0438\u043d","user_type":1}}

如何编码这个答案以获得可读的内容?我试过 JSONSerialization 但没有用。任何想法?我的函数中的示例代码将不胜感激。感谢大家的时间和努力。

【问题讨论】:

  • 地址是否由非utf8字符组成?看起来是这样的
  • 这是有效的 JSON。地址是"Камыши, дом 98",名称是"Владимир Кузьмин"JSONSerialization(或更好的Decodable)应该可以工作。将值分配给标签,然后您将看到西里尔字母。
  • 另外你不需要在主线程中调用api。当你要做 UI 工作时使用主线程,例如DispatchQueue.main.async { label.text = "name" table.reloadData() }
  • @vadian 谢谢您的回答,附加到标签不起作用,因为我在这里遇到错误:使用未解析的标识符“responseString”让 userAdd = responseString[indexPath.row] cell.userAddress .text = userAdd["address"] as?字符串
  • @RajSharma 谢谢,我删除了 DispatchQueue.main.async

标签: json swift encode


【解决方案1】:

你可以试试

do {

    let form = DateFormatter()

    form.dateFormat = "yyy-MM-dd HH:mm:ss"

    let dec = JSONDecoder()

    dec.keyDecodingStrategy = .convertFromSnakeCase

    dec.dateDecodingStrategy = .formatted(form)

    let res = try dec.decode(Root.self,from:dataNew)

    print(res)
}
catch {

    print(error)
}

struct Root: Codable {
    let status: String
    let answer: Answer
}

struct Answer: Codable {
    let address, name: String
    let createdAt, updatedAt: Date
    let userType: Int
}

这个

DispatchQueue.main.async {

应该在任何 UI 更新的回调中,因为默认情况下 session.dataTask(with: 在后台线程中运行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-11
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多