【问题标题】:Parsing JSON data with Gloss and Alamofire in swift使用 Gloss 和 Alamofire 快速解析 JSON 数据
【发布时间】:2016-12-04 18:48:26
【问题描述】:

我尝试使用 Swift 3、Gloss 1.1 和 Alamofire 4.0 解码来自 webrequest 的 json 对象: json 响应如下所示:

 {   
    "code": "0", 
    "message": "OK.",
    "data": [
        {
            "timestamp": 1480885860,
            "open": 10.99
        },
        {
            "timestamp": 1480886040,
            "open": 11
        }
    ]
}

我的json Decodables是以下两个:

struct ResponseJsonModel : Decodable {
    let code : Int
    let message : String
    let data : [MarketPriceJsonModel]?
    
    // <~~
    init?(json: JSON) {
        guard let codeInt : Int = "code" <~~ json else {
            print("code unwrapping failed in guard")
            return nil
        }
        guard let messageStr : String = "message" <~~ json else {
            print("message unwrapping failed in guard")
            return nil
        }
    
        self.code = codeInt
        self.message = messageStr
        self.data = "data" <~~ json
    }
}
struct MarketPriceJsonModel : Decodable {
    let timestamp : NSDate
    let open : Double
    init?(json: JSON) {
        guard let timestampInt : Int = "timestamp" <~~ json else {
            print("timestamp unwrapping failed in guard")
            return nil
        }
        guard let open : Double = "open" <~~ json else {
            print("open price unwrapping failed in guard")
            return nil
        }
        self.timestamp = NSDate(timeIntervalSince1970: Double(timestampInt))
        self.open = open
    }
}

我是 Gloss 新手,不明白为什么我的可解码对象初始化失败。

Alamofire.request(url).validate().responseJSON { response in
            switch response.result {
            case .success:
                guard let value = response.result.value as? JSON,
                    let responseModel = ResponseJsonModel(json: value) else {
                    print("responseModel failed")
                    return
                }
                print(responseModel.message)
            case .failure(let error):
                print(error)
            }
        }
        

代码的输出是

代码解包失败

responseModel 失败

但是为什么?

当我在 init?() 中添加断点并查看调试区域中的 json 变量时,请求看起来正常但解析失败。

有没有办法在出现故障时获得更好的异常消息?

任何意见表示赞赏。

【问题讨论】:

    标签: json swift


    【解决方案1】:

    好的,问题解决了。这是网络服务的错误配置。 可以看到,code属性的json响应是:

     "code": "0", 
    

    这种格式显然代表一个字符串,因此我的解析为 Int 的守卫将失败。 为了解决这个问题,我找到了两种可能的方法。

    选项 1: 要么将 json 响应更改为:

    "code": 0, 
    

    (值没有更多的引号)。这可能是最好的解决方案,因为它修复了 Web 服务的错​​误数据类型,但它需要完全控制服务的代码库。

    选项 2: 只需将 json 响应解析为字符串,然后强制解包为 Int 也可以。对于此解决方案,Web 服务将保持不变。

    guard let codeStr : String = "code" <~~ json else {
        print("code unwrapping failed in guard")
        return nil
    }
    self.code = Int(codeStr)!
    

    【讨论】:

      猜你喜欢
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      相关资源
      最近更新 更多