【问题标题】:Fetch dict data from array从数组中获取字典数据
【发布时间】:2018-12-04 19:40:19
【问题描述】:
{
"valueSet": true,
"valueList": [
    {},
    {
        "conId": "003q000000jvwIrAAI"
    }
],
"httpCode": 200,
"errorSet": false,
"errorList": []
}

这是我从服务器得到的响应。但实际上我是 swift 新手,所以我不知道如何获得那个“conId”的值。我正在执行以下代码来获取 valueList,但在那之后如何获得它,我没有得到如何获得那个“conId”。我需要在回调中将该 conId 作为字符串发送。

let parseResult: [String : AnyObject]
                do{
                    parseResult = try JSONSerialization.jsonObject(with: jsonData, options:.allowFragments) as! [String : AnyObject]
                    print("\(parseResult)")
                } catch {
                    print("Could not parse data as Json \(String(describing: data))")
                    return
                }

                if let valueSet = parseResult["valueSet"] {
                    let value  =  valueSet as! Bool
                    print("statusCode: \(httpResponse.statusCode)")
                    if let valueList = parseResult["valueList"] {
                        print(valueList)
                    if(httpResponse.statusCode == Constants.KNetworkSuccessCode) && (value == true) {
                        callback(httpResponse.statusCode, value, "")
                    }else {
                        callback(httpResponse.statusCode, value, "")
                    }
                    }
                }

【问题讨论】:

  • 如果你使用的是 Swift 4,你应该使用 Codable 协议

标签: ios swift swift3 swift4


【解决方案1】:

你已经接近了。您需要将 valueList 转换为字典数组,如下所示:

if let valueList = parseResult["valueList"] as? [[String: String]] {

然后你可以遍历 valueList 来找到你想要的,或者直接用valueList[1]["conId"]访问它。

注意,我使用as? [[String: String]] 来确保 valueList 作为正确的数据类型返回,否则它将为 nil 并导致if let 失败。我建议您使用 as? 而不是 as! 进行演员表,这样您就可以通过这种方式捕获错误。

【讨论】:

    【解决方案2】:

    您可以通过以下方式获取conId的值...

    //get the "valueList" from response
    if let valueList = obj["valueList"] as? [[String: Any]] {
    
      //get the conId from [String: Any]
      for item in valueList {
    
        if let conId = item["conId"] as? String {
            print(conId)
        }
      }
    }
    

    【讨论】:

    • 这里抛出错误。 “类型‘AnyObject’不符合协议‘序列’”。
    • 错误是as! [String : AnyObject]的b'coz,只需将其更改为parseResult = try JSONSerialization.jsonObject(with: jsonData, options:.allowFragments) as! [String : Any]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多