【问题标题】:How to write JSON serialization in Swift 4如何在 Swift 4 中编写 JSON 序列化
【发布时间】:2026-02-21 09:10:02
【问题描述】:

我有这个正文要发送给后端`{

    "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]!

然后尝试将字典创建为字符串,但是当我尝试使用时

试试吧! JSONSerialization.data(withJSONObject:参数,选项:.prettyPrinted) 我无法创建正确的 json 文件来发送给我的后端,服务器返回状态码 422

我该如何解决?我是使用 swift 4 和可编码的新手

功能

 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)
    }

参数

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]
}

【问题讨论】:

  • 您是如何在代码中调用 JSONSerialization 的?您可以将其添加到您的帖子中吗?
  • @ChristianAbella 我更新了更多详细信息的答案,抱歉

标签: json swift serialization swift4


【解决方案1】:

Cart 结构的结构与 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
}

创建您的 Cart 值,然后使用 JSONEncoder 将其转换为 json。


其他一些建议:

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

  • 如果字段名称已经匹配,则无需重新定义编码键。

【讨论】:

    【解决方案2】:

    回答

    创建与我的 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)
            }
    
        } 
    

    【讨论】: