SwiftyJSON - 无法解析 Json

Posted

技术标签:

【中文标题】SwiftyJSON - 无法解析 Json【英文标题】:SwiftyJSON - Unable to Parse Json 【发布时间】:2017-07-24 12:33:07 【问题描述】:

我从 API 调用接收到以下 JSON。


  "status" : "success",
  "promotion" : 
    "insert_list" : [

    ],
    "remove_list" : [
      
        "id" : "9"
      
    ]
  ,
  "message" : "Synchronized Successfully."

我想通过提取个人ID来处理remove_list,这是我正在使用的快速代码。

Alamofire.request(requestURL, method: .post, parameters: parameters).responseJSON  response in
    switch response.result 
    case .success(let value):
        let response = JSON(value)
        print(response)
        if "success" == response["status"] 
            // Format Promotion Ids To Remove From List
            var promotionIdsToRemove:[Int32] = []
            for (_,promotionJson):(String, JSON) in response["promotion"]["remove_list"] 
                promotionIdsToRemove.append(promotionJson["id"].int32!)
               
        
    case .failure(let error):
        print(error)
    

这给我一个错误提示,fatal error: unexpectedly found nil while unwrapping an Optional value 指向以下代码 promotionIdsToRemove.append(promotionJson["id"].int32!)

如果我只打印promotionJson["id"],它会给我正确的值,但是当我对它进行类型转换时,会抛出这个错误。

这可能是什么问题?

【问题讨论】:

您是否尝试打印promotionJson["id"]? 是的!它打印值 9,问题出在类型转换时。 但它是一个字符串,你确定 swifty 可以将任何你强制解包的东西更改为 int32 吗? 如果promotionJson["id"]被解析为字符串,你应该尝试使用Int(promotionJson["id"]) @DávidPásztor 谢谢。它似乎可以解决问题。 【参考方案1】:

您需要通过告诉 SwiftyJSON 来将 remove_list 视为一个数组。你的代码应该是

for removeJSON in response["promotion"]["remove_list"].arrayValue 
    // removeJSON is of type JSON here
    promotionIdsToRemove.append(removeJSON["id"].intValue)

这将遍历 remove_list 数组并将所有 id 附加到 promotionIdsToRemove。如果项目没有 id 字段,.intValue 将确保您获得正确的值或为 id 获得0

【讨论】:

让我试试这个。 这仍然给了我错误。我发布的解决方案似乎是唯一有效的解决方案。不过这很奇怪。 这很奇怪......我已经使用 SwiftyJSON 工作了很多次,但从未见过像您所经历的那样。你确定你复制了我的整个循环吗? 确实很奇怪,我也一直在用SwiftyJSON,第一次遇到这个问题。【参考方案2】:

response["promotion"]["remove_list"] 应该是数组,而不是字典。

将您的代码更改为

        for promotionJson in response["promotion"]["remove_list"] 
            promotionIdsToRemove.append(promotionJson["id"].int32!)
           

【讨论】:

这不起作用。它给了我错误"Type JSON._Element (aka (String, JSON)) has no subscript members."【参考方案3】:

谢谢@DávidPásztor,下面的代码似乎可以解决问题。

var promotionIdsToRemove:[Int32] = []
for (_,promotionJson):(String, JSON) in response["promotion"]["remove_list"] 
    promotionIdsToRemove.append(Int32(promotionJson["id"].string!)!)

【讨论】:

以上是关于SwiftyJSON - 无法解析 Json的主要内容,如果未能解决你的问题,请参考以下文章

无法解析数据 JSON alamofire SwiftyJSON

SwiftyJSON - 无法访问 JSON 数据

SwiftyJSON - 无法从 JSON 字符串获取 transactionId

使用 SwiftyJSON 解析 JSON

使用 SwiftyJSON iOS 解析 JSON 响应

尝试使用 swiftyJSON 快速解析 JSON