通过索引方式从JSON检索dict时崩溃

问题描述 投票:-4回答:2

我正在通过JSON的索引检索数据让我告诉你我的回复

{
  "contraventionsData" : [
    {
      "id" : "1",
      "contravention_id" : "314",
      "question" : "Last Gas Boiler Service date (Noted on boiler)",
      "Options" : [
        {
          "action" : "Yes"
        },
        {
          "action" : "Further Investigation \/ Maintenance"
        },
        {
          "action" : "N\/A"
        }
      ]
    },
    {
      "id" : "2",
      "contravention_id" : "314",
      "question" : "Is Gas Boiler due a service? (Over 12 Months)",
      "Options" : [
        {
          "action" : "Yes"
        },
        {
          "action" : "Maintenance Attention"
        },
        {
          "action" : "N\/A"
        }
      ]
    },
    {
      "id" : "3",
      "contravention_id" : "314",
      "question" : "Gas heating system \/ boiler working ok?",
      "Options" : [
        {
          "action" : "Yes"
        },
        {
          "action" : "Maintenance Attention"
        },
        {
          "action" : "N\/A"
        }
      ]
    },
    {
      "id" : "4",
      "contravention_id" : "314",
      "question" : "Copy of Current Service Cert give to tenant",
      "Options" : [
        {
          "action" : "Yes"
        },
        {
          "action" : "Tenant to be provided with copy of current service cert"
        },
        {
          "action" : "N\/A"
        }
      ]
    }
  ],
  "message" : "Successfully.",
  "success" : "1"
}

这是我的回复,我正在通过索引检索,如下所示

func actionListAPI(){
    let preferences = UserDefaults.standard
    let uid = "u_id"
    let acTkn = "acc_tkn"


    let u_ID = preferences.object(forKey: uid)
    let A_Token = preferences.object(forKey: acTkn)

    let params = ["user_id": u_ID!, "access_token": A_Token!,"contraventions_id": conID!]
    print(params)
    SVProgressHUD.show()
    Alamofire.request(reg6contraventionsquestions, method: .post, parameters: params).responseJSON(completionHandler: {(response) in
        switch response.result{
        case.success(let value):
            let json  = JSON(value)
            print(json)
            let data = json["contraventionsData"]
            if data == []{

            }else{

                let sampleArray = data.array
                let firstdict = sampleArray![0]
                print(firstdict)
                let question = firstdict["question"].stringValue
                self.lblQue1.text = question

                let sampleArray1 = data.array
                let firstdict1 = sampleArray1![1]
                print(firstdict1)

                let question1 = firstdict1["question"].stringValue
                self.lblQue2.text = question1

                let sampleArray2 = data.array
                let firstdict2 = sampleArray2![2]
                print(firstdict2)
                let question2 = firstdict2["question"].stringValue
                self.lblQue3.text = question2

            }
            SVProgressHUD.dismiss()
        case.failure(let error):
            print(error.localizedDescription)
        }

    })
}

所以问题是,当我只得到两个dict作为回应然后我在第三个索引上崩溃所以如何handel错误请告诉我我有最多4个问题作为回应

如何处理错误请有人告诉我

ios swift nsdictionary
2个回答
0
投票

而不是硬编码索引使用循环

var questions = [[String:Any]]()

if let sampleArray = data.array {
  for dict in sampleArray {
     print(dict) 
     questions.append(dict)
  }
}

或者更简单

if let sampleArray = data.array {
    questions = sampleArray
}

或者如果你需要索引

if let sampleArray = data.array {
    for (index, dict) in sampleArray.enumerated() {
       print(dict, index)
       questions.append(dict)
    }
}

0
投票

您可以在for循环中使用一个开关来处理不同的id值,这在数组较短时不会产生错误

for item in sampleArray {
  if let id = item["id"] as? Int {
    let question = item["question"]  as? String ?? ""
    switch id {
      case 1:
        self.lblQue1.text = question
    case 2:
        self.lblQue2.text = question
    case 3:
        self.lblQue3.text = question
    case 4:
        self.lblQue4.text = question
    default:
    print("error, unsupported id: \(id)")
  }
}

}

© www.soinside.com 2019 - 2024. All rights reserved.