【问题标题】:How to add Array value to JSON Key in Swift如何在 Swift 中将数组值添加到 JSON 键
【发布时间】:2020-05-29 11:04:09
【问题描述】:

如何添加request.httpBody = getPostData(params: ["contactsList": ["1212121212, "5555555544"]]) 代替 let parameters = getPostString(params: ["contactsList":[phNumArray]])

以下是工作代码,但如何将phNumArray 代替个人号码添加到联系人列表中

API 的 Postman 输出:

工作代码:任何人都可以复制粘贴以查看输出

import UIKit
class TestViewController: UIViewController {
    var phNumArray = ["1111111111", "5555555544"]
    override func viewDidLoad() {
        super.viewDidLoad()

        callPostApi()
    }

    func getPostString(params: [String: Any]) -> String {
        var data = [String]()
        for (key, value) in params {
            data.append(key + "=\(value)")
        }
        print(data.map { String($0) }.joined(separator: "&"))
        return data.map { String($0) }.joined(separator: "&")
    }

    func callPostApi() {
        let url = URL(string: "http://itaag-env-1.ap-south-1.elasticbeanstalk.com/filter/taggedusers/")
        guard let requestUrl = url else { fatalError() }
        var request = URLRequest(url: requestUrl)
        request.httpMethod = "POST"

        request.setValue("EC3746E9-4DB4-42C7-9D8C-1542B18C2AC", forHTTPHeaderField: "deviceid")
        request.setValue("5fe42fb3b54543a0bab5667cf96526f8", forHTTPHeaderField: "key")
        request.setValue("personal", forHTTPHeaderField: "userType")

        let parameters = getPostString(params: ["contactsList": ["5555555544", "11111111111"]])

        print("json parameter phone numbers \(parameters)")

        request.httpBody = parameters.data(using: .utf8)
        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            let httpResponse = response as? HTTPURLResponse
            // Check for Error
            if let error = error {
                print("Error took place \(error)")
                return
            }
            if let data = data, let dataString = String(data: data, encoding: .utf8) {
                print("Response data string:\n \(dataString)")

                do {
                    let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! [String: Any]
                    print("fetching json \(json)")
                    let fetchStatus = json["userName"] as? String
                    print("fetching json userName \(String(describing: fetchStatus))")

                    let user = json["5555555544"] as? [String: Any]
                    let name = user?["userName"] as? String
                    print("first username \(name)")
                } catch {}
            }
        }
        task.resume()
    }
}

请帮我解决contactsList 值的问题。

【问题讨论】:

    标签: json swift uitableview parameters contacts


    【解决方案1】:

    更新:一直以来,您都以JSON 编码发送请求,而不是form-data。我在下面添加代码,试试看:

    class ViewController: UIViewController {
    
        var phNumArray  = ["1111111111", "5555555544"]
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            callPostApi()
        }
    
        func getPostData(params: [String:Any]) -> Data? {
            return try? JSONSerialization.data(withJSONObject: params, options: .prettyPrinted)
        }
    
        func callPostApi() {
    
            let url            = URL(string: "http://itaag-env-1.ap-south-1.elasticbeanstalk.com/filter/taggedusers/")!
            var request        = URLRequest(url: url)
            request.httpMethod = "POST"
    
            request.setValue("EC3746E9-4DB4-42C7-9D8C-1542B18C2AC", forHTTPHeaderField: "deviceid")
            request.setValue("5fe42fb3b54543a0bab5667cf96526f8", forHTTPHeaderField: "key")
            request.setValue("personal", forHTTPHeaderField: "userType")
    
            try? request.setMultipartFormData(["contactsList": "\(phNumArray)"], encoding: .utf8)
    
            URLSession.shared.dataTask(with: request) { data, _, _ in
                if let data = data, let json = try? JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
    
                    let user = json["5555555544"] as? [String: Any]
                    let name = user?["userName"] as? String
                    print("first username \(name)")
                }
            }.resume()
        }
    }
    
    extension URLRequest {
    
        public mutating func setMultipartFormData(_ parameters: [String: String], encoding: String.Encoding) throws {
    
            let makeRandom = { UInt32.random(in: (.min)...(.max)) }
            let boundary = String(format: "------------------------%08X%08X", makeRandom(), makeRandom())
    
            let contentType: String = try {
                guard let charset = CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(encoding.rawValue)) else {
                    throw MultipartFormDataEncodingError.characterSetName
                }
                return "multipart/form-data; charset=\(charset); boundary=\(boundary)"
            }()
            addValue(contentType, forHTTPHeaderField: "Content-Type")
    
            httpBody = try {
                var body = Data()
    
                for (rawName, rawValue) in parameters {
                    if !body.isEmpty {
                        body.append("\r\n".data(using: .utf8)!)
                    }
    
                    body.append("--\(boundary)\r\n".data(using: .utf8)!)
    
                    guard
                        rawName.canBeConverted(to: encoding),
                        let disposition = "Content-Disposition: form-data; name=\"\(rawName)\"\r\n".data(using: encoding) else {
                        throw MultipartFormDataEncodingError.name(rawName)
                    }
                    body.append(disposition)
    
                    body.append("\r\n".data(using: .utf8)!)
    
                    guard let value = rawValue.data(using: encoding) else {
                        throw MultipartFormDataEncodingError.value(rawValue, name: rawName)
                    }
    
                    body.append(value)
                }
    
                body.append("\r\n--\(boundary)--\r\n".data(using: .utf8)!)
    
                return body
            }()
        }
    }
    
    public enum MultipartFormDataEncodingError: Error {
        case characterSetName
        case name(String)
        case value(String, name: String)
    }
    

    不要转换成 JSON String,然后再转换成 Data,而是使用 JSONSerialization,下面是一个例子:

    func getPostData(params:[String:Any]) -> Data? {
        return try? JSONSerialization.data(withJSONObject: params, options: .prettyPrinted)
    }
    

    然后直接赋值给URLRequesthttpBody,像这样:

    let arrayOfNumbers = [String]()
    arrayOfNumbers.append("5555555544")
    arrayOfNumbers.append("11111111111")
    request.httpBody = getPostData(params: ["contactsList": arrayOfNumbers])
    

    另外,通过Apple Documentation,您会在那里找到有价值的信息。如果不了解概念,请在 Google 上了解更多关于 JSONSerializing 和 POST 请求 httpBody 的信息。

    【讨论】:

    • phNumArray 是什么类型?是[String]吗?应该是JSONSerializable
    • 我再次更新以展示如何将新数字附加到数组中。
    • 您能否在 Xcode-Playground 中制作一个工作代码示例并更新您问题中的代码?您应该始终通过minimal-repordusable-example 提问。
    • 如何添加phNumArray to contactsList 请为此做点什么
    • 检查如何将数组作为参数传递。
    猜你喜欢
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    相关资源
    最近更新 更多