如何在Swift 4中编写JSON序列化

如何在Swift 4中编写JSON序列化,json,swift,serialization,swift4,Json,Swift,Serialization,Swift4,我有这个身体发送后端`{ "cart": { "products": [ { "id": 3, "quantity": 2 }, { "id": 6,

我有这个身体发送后端`{

    "cart": 
        {
            "products": [
                    {
                        "id": 3,
                        "quantity": 2
                    },
                    {
                        "id": 6,
                        "quantity": 1
                    }
                ],
            "card": 
                    {
                        "id": "card_21378921w"
                    }

        }

}`
我尝试使用可编码对象创建:

    struct Cart: Codable  {

        var id: Int!
        var quantity: Int!

 private enum CodingKeys: String, CodingKey {

        case id = "id"
        case quantity = "quantity"

    }

   }

    var cart: [Cart]!
然后尝试创建一个字典作为字符串,但当我尝试使用

try!JSONSerialization.datawithJSONObject:参数,选项:。预打印 我无法为后端创建正确的json文件,服务器返回状态代码422

我怎么能解决这个问题?我刚开始使用swift 4和codables

作用

 static func createCheckout(accessToken: String, buildingId: Int,products:[Cart], card_id: String,completion: @escaping (CommonResponse?, _ error: Int?) -> ()) {
    let url = Url.createCheckout(buildingId: buildingId)
    let parameters = Params.createCheckout(products: products, card_id: card_id)



    if (!JSONSerialization.isValidJSONObject(parameters)) {

        print(parameters)
        print("is not a valid json object")
        return
    }

    let encodedParameters = try! JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)

    var request = URLRequest(url: URL(string: url)!)
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
    request.httpBody = encodedParameters

    Alamofire.request(request).responseDecodableObject(decoder: JSONDecoder()) { (response: DataResponse<CommonResponse>) in
        let repo = response.result.value
        let error = response.response?.statusCode

        completion(repo, error)
    }
Params

static func createCheckout(products:[Cart], card_id: String) -> Dictionary<String, Any> {
    let products: [String: Any] = ["products": products]
    let card_number: [String: Any] = ["id": card_id]

    return ["cart" : products, "card": card_number]
}
购物车结构的结构与json的结构不匹配。请尝试以下操作:

struct Product: Codable {
   let id: Int
   let quantity: Int
}

struct Card: Codable {
   let id: String
}

struct Cart: Codable {
   let products: [Product]
   let card: Card
}
创建购物车值,然后使用JSONEncoder将其转换为json

其他一些建议:

尽量避免像Int!这样的隐式展开值。如果在生产中使用此代码,您将遇到许多致命错误

如果字段的名称已经匹配,则不需要重新定义编码键

答复

创建与我的JSON匹配的正确结构

   struct Checkout: Codable {
    var cart: Cart
}

struct Cart: Codable {
    var products: [Product]
    var card: Card
}

struct Card: Codable {
    var id: String
}

struct Product: Codable {
    var id, quantity: Int
}
然后使用Alamofire和JSONEncoder正确调用

 static func createCheckout(accessToken: String, buildingId: Int,checkout: Checkout,completion: @escaping (_ error: Int?) -> ()) {
        let url = Url.createCheckout(buildingId: buildingId)

        let encodedData = try? JSONEncoder().encode(checkout)

        var request = URLRequest(url: URL(string: url)!)
        request.httpMethod = "POST"
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.addValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
        request.httpBody = encodedData

         Alamofire.request(request).responseJSON { response in
            let error = response.response?.statusCode
            completion(error)
        }

    } 

你如何在你的代码中调用JSONSerialization?你能把它添加到你的帖子中吗?@ChristianAbella我更新了答案,提供了更多细节,对此表示抱歉