在ios中发送json对象数组

时间:2018-04-18 08:50:25

标签: ios json swift post alamofire

我有一个帖子请求有这样的身体

 {
   "cars": [
       {
           "id": 126,
           "drivers": [
                 "xxx@gmail.com"
           ]
       },
       {
           "id": 128,
           "drivers": [
                   "mmm@gmail.com"
           ]
       }
   ]
}

id和驱动程序是可更改的,我从另一个API获取它们以便如何使用post请求发送此正文?

另一方面,我有一个textField,它接收另一封驱动程序的电子邮件,我想在发送此请求时更改驱动程序。

示例:

 {
   "cars": [
       {
           "id": 126,
           "drivers": [
                 "xxx@gmail.com",
                 "sss@gmail.com"
           ]
       },
       {
           "id": 128,
           "drivers": [
                   "mmm@gmail.com"
           ]
       }
   ]
}

正如您所看到的,当我点击特定textField上的添加按钮取决于ID时,我想要将驱动程序更新为新驱动程序。

这是我的代码

public static func loadDrivers(owners: [Owner], drivers: [Driver], driverEmail: String!, i: Int, completion: @escaping (_ code:Int?)-> Void) {

        let headers: HTTPHeaders = [
            "Accept": "application/json"
        ]

        var para2 = [String : [[String : Any]]]()

        para2 = [

            "cars": [
                [
                    "id": owners[i].id,
                    "drivers": [
                        drivers[i].email,
                        driverEmail
                    ]
                ]
            ]
        ]

            if driverEmail != nil {

            Alamofire.request(APIHelper.BASE_URL + APIHelper.API.ADD_DRIVERS.rawValue, method: .post, parameters: para2, encoding: JSONEncoding.default, headers: headers).responseJSON { (response) in

                switch response.result {
                case .success:
                    let json = response.result.value as? NSDictionary
                    let code = json!["code"]
                    completion(code as? Int)
                case .failure(let error):
                    print(error)
                    completion(nil)
                    return
                }
            }
        }
    }

提前致谢

2 个答案:

答案 0 :(得分:1)

这个问题在我身上尖叫着Codable协议,所以就这样吧。 Codable协议使用真正的Swift对象生成JSON变得轻而易举。在游乐场试试这个:

import Cocoa

struct Car : Codable {
    let id:Int
    let drivers:[String]    // you will want to improve on this
}

struct Mobiles : Codable {
    let cars:[Car]
}

var mobiles = Mobiles(cars:[Car(id:126, drivers:["xxx@gmail.com", "sss@gmail.com"]),
    Car(id:128, drivers:["mmm@gmail.com"])])

let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted

print(String(data:try encoder.encode(mobiles), encoding:.utf8)!)

由于您应该能够在此等式的两端使用Swift,因此很容易看出这需要比您的示例更少的 lot 代码。

答案 1 :(得分:0)

正如你在Json的例子中所说,你在“汽车”中有一系列词典。字段,但你在这一行的字典里面写了一个字典:

var para2 = [String : [[String : Any]]]()

您可以这样定义para2:

var para2 = [String, Array<[String:Any]>]

然后将其作为参数发送