如何从 API 的结构内获取解码数据 [已关闭]

How can I get decoded data from a struct inside a struct from an API [closed]

提问人:bumblebee 提问时间:9/15/2023 最后编辑:Brian Tompsett - 汤莱恩bumblebee 更新时间:9/15/2023 访问量:70

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

2个月前关闭。

我正在尝试学习如何使用 AlamoFire,我想获取此结构中结构的值。如何实现这一点?MyData


import Foundation
import Alamofire

struct MyData : Codable {
    
    let id: Int
    let uid : String
    let password : String
    let first_name : String
    let last_name :String
    let username : String
    let email : String
    let avatar : String
    let gender : String
    let phone_number : String
    let social_insurance_number : String
    let date_of_birth : String
    
    struct employment : Codable {
        let title : String
        let key_skill : String
    }
    
    struct address : Codable {
        var city : String
        var street_name : String
        var street_address : String
        var zip_code : String
        var state : String
        var country : String
        
        struct coordinates : Codable {
            var lat : Int
            var lng : Int
        }
    }
    
    
    struct credit_card : Codable{
        let cc_number : String
    }
    struct subscription : Codable {
        var plan : String
        var status : String
        var payment_method : String
        var term : String
    }
    
}


func getApi() {
   
    let url = "https://random-data-api.com/api/v2/users"
    AF.request(url).responseData { response in
        debugPrint(response)
        guard let data = response.data
        else{
           return
        }
        
        do {
            let decoder = JSONDecoder()
            let json = try decoder.decode(MyData?.self, from: data)
            decoder.keyDecodingStrategy = .convertFromSnakeCase
            print("SOCIAL INSURANCE NUMBER : \(String(describing: json!.social_insurance_number))")  
        }
        catch{
            print(error)
        }   
    } 
  }

我尝试从 API 获取数据。我的数据模型在结构中有一个结构。我无法获取父结构中的结构,但可以获取父结构中声明的变量的值。

iOS Swift 结构 Alamofire

评论

2赞 vadian 9/15/2023
MyData?.self毫无意义。将其替换为 .在行之后应用键解码策略也是没有意义的。MyData.selfdecode
1赞 Larme 9/15/2023
在同一级别上,如果作为 的属性,则为每个子实体添加一个let date_of_birth : StringMyDatalet address: Address
0赞 Larme 9/15/2023
不相关,但不要使用 ,如果您用蛇形大小写命名 var,请命名不带蛇形大小写的 var:-> 。此外,您可以直接使用而不是.convertFromSnakeCaselast_namelastNameresponseDecodable(of:)responseData

答:

0赞 KerryDong 9/15/2023 #1

在 your 中插入以下代码以继续解码。MyData

    let employment: Employment
    let address: Address
    let credit_card: CreditCard
    let subscription: Subscription

不要忘记将结构上的首字母大写,添加并更改为 .var coordinatesIntDouble

struct Employment: Codable {
    // ...
}

struct Address: Codable {
    // ...
    var coordinates: Coordinates // Add this
    
    struct Coordinates: Codable {
        var lat: Double // Change Int to Double
        var lng: Double // Change Int to Double
    }
}

struct CreditCard: Codable {
    // ...
}

struct Subscription: Codable {
    // ...
}