SwiftyJSON - 无法解析Json

时间:2017-07-24 12:33:08

标签: json swift swift3 swifty-json

我从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"]它会给我正确的值,但是当我对它进行类型转换时,会抛出这个错误。

这可能是什么问题?

3 个答案:

答案 0 :(得分: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将确保您获得正确的值或0作为ID。

答案 1 :(得分:0)

response["promotion"]["remove_list"]应该是Array,而不是Dictionary。

将您的代码更改为

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

答案 2 :(得分:0)

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

(
  Nvl2(RollNo, Year    , null),
  Nvl2(RollNo, ExamCode, null),
  RollNo
)