代码之家  ›  专栏  ›  技术社区  ›  nastassia

阿拉莫菲尔+可解码-如何将responseJSON转换为NSData

  •  0
  • nastassia  · 技术社区  · 6 年前

    我很确定我的问题很容易解决,但我找不到任何解决办法。 所以我有Alamofire请求,并且在处理数据类型时遇到问题。我有这么多的“打印出来”只是为了一步一步地检查我有什么数据。

    Alamofire.request(URL, method: .get, headers: headers).responseJSON { response in
                switch responseJSON.result {
                case .success(let value):
                    print(type(of: value))  //__NSDictionaryI
                    print(value)
                    print(type(of:responseJSON))  //DataResponse<Any>
                    print(responseJSON) . //SUCCESS: {"billing_addresses" =     (...
                    print(responseJSON.value as Any) . //Optional({...
                    //print(responseJSON.value as! [[String:Any]]) . //Could not cast value of type '__NSDictionaryI' (0x10b9fb508) to 'NSArray' (0x10b9fb008).
    
                    do {
                        let decoder = JSONDecoder()
                        let model = try decoder.decode(Info.self, from: value as! Data) //Decode JSON Response Data
                        print(model.id)
                    } catch let parsingError {
                        print("Error", parsingError)
                    }
    

    现在我有一个错误: **Could not cast value of type '__NSSingleEntryDictionaryI' (0x10d240f78) to 'NSData' (0x10d241090).**

    (我不确定这个值是否正确,因为当我签入Postman时,所有字符串都是双引号,并且“is_default”的值是true/false,而不是0/1。但在Xcode中,我在控制台中找到了这个。所以也许是反应有问题

    可能有零个地址,也可能有几个。

    {
    "id": 40128,
    "username": "test6",
    "email": "test6@on.com",
    "billing_addresses": [
        {
            "address_name": null,
            "country_code": "US",
            "first_name": "Ted",
            "last_name": "Qqqq",
            "company_name": "",
            "address_line1": "308 Sea Lane",
            "address_line2": "",
            "city": "QQQQ",
            "state": "FL",
            "postcode": "32000",
            "email_address": "test6@on.com",
            "phone_number": "11111111",
            "is_default_for_billing": true
        }
    ],
    "shipping_addresses": [
        {
            "address_name": null,
            "country_code": "US",
            "first_name": "Ted",
            "last_name": "Qqqq",
            "company_name": "",
            "address_line1": "308 Sea Lane",
            "address_line2": "",
            "city": "QQQQ",
            "state": "FL",
            "postcode": "32000",
            "is_default_for_shipping": true
        }
    ]
    

    }

    struct Info : Decodable {
                        let id: Int
                        let email: String
                        let username: String
                        let billing_addresses: Billings
                        let shipping_addresses: Shippings
                    }
                    struct Billings: Decodable{
                        let address_name: String
                        let country_code: String
                        let first_name: String
                        let last_name: String
                        let company_name: String
                        let address_line1: String
                        let address_line2: String
                        let city: String
                        let state: String
                        let postcode: String
                        let email_address: String
                        let phone_number: String
                        let is_default_for_billing: Bool
    
                    }
                    struct Shippings:Decodable{
                        let address_name: String
                        let country_code: String
                        let first_name: String
                        let last_name: String
                        let company_name: String
                        let address_line1: String
                        let address_line2: String
                        let city: String
                        let state: String
                        let postcode: String
                        let is_default_for_shipping: Bool
    
                    }
    

    如果我尝试使用SwiftyJSON value 作为参数,我有一个错误 Any 不可能是 Data 我真的不知道该怎么办。

    1 回复  |  直到 6 年前
        1
  •  2
  •   vadian    6 年前

    responseJSON.result.value 返回反序列化的集合类型,在您的示例中是字典 [String:Any]

    使用 JSONDecoder response.data

    let model = try decoder.decode(Info.self, from: response.data) //Decode JSON Response Data
    

    考虑到您将遇到解码错误: billing_addresses shipping_addresses 是数组

    let billing_addresses: [Billings] 
    let shipping_addresses: [Shippings] // better name both structs in singular form (Billing, Shipping)
    

    无论如何,建议使用 convertFromSnakeCase 密钥解码策略,以摆脱丑陋的蛇形案件名称。

    编辑:

    这是你的结构,有驼色的名字和单数形式,你必须加上

    decoder.keyDecodingStrategy = .convertFromSnakeCase
    

    struct Info : Decodable {
        let id: Int
        let email: String
        let username: String
        let billingAddresses: [Billing]
        let shippingAddresses: [Shipping]
    }
    
    struct Billing : Decodable {
        let addressName: String?
        let countryCode, firstName, lastName, companyName: String
        let addressLine1, addressLine2, city, state, postcode: String
        let emailAddress, phoneNumber: String
        let isDefaultForBilling: Bool
    
    }
    struct Shipping : Decodable {
        let addressName: String?
        let countryCode, firstName, lastName, companyName: String
        let addressLine1, addressLine2, city, state, postcode: String
        let isDefaultForShipping: Bool
    }