快速将 JSON 响应转换为结构

Posted

技术标签:

【中文标题】快速将 JSON 响应转换为结构【英文标题】:Converting JSON response to a struct in swift 【发布时间】:2018-12-26 13:36:06 【问题描述】:

我是 swift 编程新手,正在尝试从服务器获取 JSON 格式的用户数据,然后将其“粘贴”到结构中:

这是我的 api:

app.get('/getUser/:username',(req,res)=>
    let user = req.params;
    var sql = "SELECT * FROM  users WHERE username = ? ";
    mysqlConnection.query(sql,[user.username],
    function(err, rows)
        if(!err)    

       res.send(JSON.stringify("userID" : rows));

 else 
console.log(err)
         
    );
);

这是 JSON 响应:


    userID =     (
                
            email = test;
            id = 1;
            money = 200;
            password = test;
            username = test;
        
    );

这是我的 apiCall 函数:

    class func  getUser(username :String)
              
            let url = "http://127.0.0.1:3000/getUser/"+username
            Alamofire.request(url).responseJSON(completionHandler :  (response) in
                switch response.result 
                case .success( _):
                    // I want to append the user struct by the user data collected from JSON
                    print(response.result.value!)

                case .failure(let error):
                    print (error)
                

            )                   
        

这是我的结构:

struct user 
    var id : String
    var username : String
    var password : String
    var email : String
    var money : String        

我尝试在 MainPageViewController 中创建一个数组,然后附加它,但我不知道如何:

class MainPageViewController: UIViewController 
    var currentUser : String?
    var userData = [user]()
    override func viewDidLoad() 
        API.getUser(username: currentUser!)
        print(currentUser!)

        super.viewDidLoad()
     //   API.getUserID(username: currentUser!)
        // Do any additional setup after loading the view.
    

【问题讨论】:

最好的方法是使用可编码... 您的问题不明确,因为从字典输出中您无法确定idmoney 的类型是String 还是Int 嘿 louay baccary 请分享您使用的答案/解决方案,目前,我被困在同一阶段 【参考方案1】:

最好的方法是使用 Codeable:

let data: YourJSONData

struct User: Codable 
    var id: String
    var username: String
    var password: String
    var email: String
    var money: String


let user = try? JSONDecoder().decode(User.self, from: data)

编辑

要回答您的进一步问题,请像这样使用它:

static func getUserByUsername(_ username: String) 
    let url = "http://127.0.0.1:3000/getUser/" + username

    Alamofire.request(url).responseData(completionHandler :  (response) in
        switch response.result 
        case .success( let data):

            do 
                let user = try JSONDecoder().decode(Base.self, from: data)
            
            catch print(error)

        case .failure(let error):
            print (error)
        

    )


struct Base: Codable 
    let userID: [User]


struct User: Codable 
    var id: String
    var username: String
    var password: String
    var email: String
    var money: String

【讨论】:

我该如何使用它?将此代码放在哪里以及如何将其与我的 api 相关联 你想要的任何地方......现在它是一个代表用户的本机结构...... 如果你不忽略它,这会抛出一个DecodingError 嗯,和你上面写的完全一样?!? @Sh_Khan 我做了responseData 而不是responseJSON,而且这里不适合struct【参考方案2】:

你可以试试

struct Root: Codable 
    let userID: [User]


struct User: Codable 
    let email: String
    let id, money: Int
    let password, username: String


do 
    let res = try JSONDecoder().decode(Root.self,from:data)
    users = res.userID
 
 catch 
    print(error)
 

并将 Alamofire 从 responseJSON 更改为 responseData


Alamofire.request(url).responseData(completionHandler :  (response) in
    switch response.result 
    case .success( let data):
        // I want to append the user struct by the user data collected from JSON
        print(response.result.value!)
        do 
            let res = try JSONDecoder().decode(Root.self,from:data)
            userData = res.userID
        
        catch 
            print(error)
        

    case .failure(let error):
        print (error)
    

)

【讨论】:

我不明白,我的问题是我想将数据从 JSON 转换为字符串,然后将其附加到我的结构中 那么 Swift 中的 JSON 只是一个字符串……你必须将它序列化为一个结构体,然后你可以将它用作结构体,无论你想做什么……

以上是关于快速将 JSON 响应转换为结构的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 4 Decodable 将字符串 JSON 响应转换为布尔值

将 JSON 数据转换为字典

将 XML 响应转换为 Json 时出错

将 JSON 响应转换为 Dictionary Swift

如何将此 JSON 格式转换为模型类并使用改造将响应转换为列表

将响应变量转换为 JSON 文件