【问题标题】:Parse JSON data in swift快速解析 JSON 数据
【发布时间】:2017-07-05 13:04:55
【问题描述】:

我正在尝试在 swift 3.0 中解析我的 json 数据。我正在使用 Alamofire 4.0+ 这是我的json

{
"token": 

"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1MDQ0MjgzNzgxMTF9.CNonyvtQbRgaqqkdPO5KwqpVaUmlGrpaTqlBxmvaX80",

"expires": 1504428378111,

"user": 
[{"user_id":13,"user_first_name":"Himanshu","user_last_name":"Srivastava","full_name":"Himanshu Srivastava"}]
}

这是我保存这些值的模型类

import Foundation
import ObjectMapper
class LoginResult:Mappable{
    var token:String?
    var expires:Double?
    var users:[[String:Any]]?
    required init?(map:Map){

    }

    func mapping(map:Map)->Void{
        self.token <- map["token"]
        self.expires <- map["expires"]
        self.users <- map["user"]
    }
}

互联网上可用的解决方案都不适合我。如何解析这个 json 并映射到模型类? 这里有什么帮助吗?

【问题讨论】:

  • 看来user键的值是另一个代表数组的嵌套JSON字符串。如果您负责服务器端更改数据格式并发送 real 数组。
  • 您的 json 格式不正确。你可以在 users 下有一个数组,但为什么在双引号内?
  • 你需要将数据转换成json还是什么??
  • 可能与您的问题无关,但我建议定义一个User: Mappable 来表示用户对象,并在您的LoginResult: Mappable 中将用户声明为var users: [User]?
  • @vadian 我无法更改格式,因为 Android 和 Web 使用相同的格式

标签: json swift alamofire objectmapper


【解决方案1】:

我弄错了,键user的值确实是一个正则数组。

这是一个没有第三方映射器和额外的User 结构的解决方案(顺便说一下,键expires 的值是Int 而不是Double)。 假设user 数据来自始终发送所有字段的数据库,则用户密钥被强制解包。如果不是这种情况,也可以为 user 数据使用可选绑定:

struct User {
    let firstName : String
    let lastName : String
    let fullName : String
    let userID : Int
}

class LoginResult {
    let token : String
    let expires : Int
    var users = [User]()

    init(json : [String:Any]) {
        self.token = json["token"] as? String ?? ""
        self.expires = json["expires"] as? Int ?? 0
        if let users = json["user"] as? [[String:Any]] {
            self.users = users.map { User(firstName: $0["user_first_name"] as! String,
                                          lastName: $0["user_last_name"] as! String,
                                          fullName: $0["full_name"] as! String,
                                          userID: $0["user_id"] as! Int)
            }
        }
    }
}

let json = "{\"token\":\"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1MDQ0MjgzNzgxMTF9.CNonyvtQbRgaqqkdPO5KwqpVaUmlGrpaTqlBxmvaX80\",\"expires\":504428378111,\"user\":[{\"user_id\":13,\"user_first_name\":\"Himanshu\",\"user_last_name\":\"Srivastava\",\"full_name\":\"Himanshu Srivastava\"}]}"    
let jsonData = json.data(using: .utf8)!    
do {
    if let userData = try JSONSerialization.jsonObject(with: jsonData) as? [String:Any] {
        let loginResult = LoginResult(json: userData)
        print(loginResult.users[0])
        // do something with loginResult
    }         
} catch {
    print(error)
}

【讨论】:

    【解决方案2】:

    这是用字典替换地图的答案。不要忘记处理错误或小心解包:)

    let str = "{\"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1MDQ0MjgzNzgxMTF9.CNonyvtQbRgaqqkdPO5KwqpVaUmlGrpaTqlBxmvaX80\",\"expires\": 1504428378111,\"user\": [{\"user_id\":13,\"user_first_name\":\"Himanshu\",\"user_last_name\":\"Srivastava\",\"full_name\":\"Himanshu Srivastava\"}]}"
    
    let data = str.data(using: .utf8)
    
    do{
        let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [String: Any]
    
        //Pass this json into the following function
    }catch let error{
    
    }
    
    func mapping(json:[String: Any]?)->Void{
        self.token <- json?["token"] as? String
        self.expires <- json?["expires"] as? Double
        self.users <- json?["user"] as? [[String: Any]]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多