Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用JSON在数组中存储数据_Ios_Json_Parsing_Jsonparser - Fatal编程技术网

Ios 如何使用JSON在数组中存储数据

Ios 如何使用JSON在数组中存储数据,ios,json,parsing,jsonparser,Ios,Json,Parsing,Jsonparser,此代码中存在一些问题。我无法解决。如何解决 func loadFromWebserviceData(completion :@escaping (DataSourceModel?) -> ()){ Alamofire.request("http://www.example.com").validate(statusCode: 200..<300).validate(contentType: ["application/json"]).responseJSON{

此代码中存在一些问题。我无法解决。如何解决

 func loadFromWebserviceData(completion :@escaping (DataSourceModel?) -> ()){


        Alamofire.request("http://www.example.com").validate(statusCode: 200..<300).validate(contentType: ["application/json"]).responseJSON{ response in


            print(response)

            switch response.result{


            case .success(let data):
                print("success",data)


                let result = response.result

                print(result)

                if     let wholedata = result.value as? [String:Any]{

                    print(wholedata)


                    let data1 = wholedata["data"] as? NSArray
                    print(data)
                  let  array = data1["options"] as? [String:Any]
                  print(array)


                    if  let data = wholedata["data"] as? Array<[String:Any]>{

                        print(data)
                        print(response)




                        let newDataSource:DataSourceModel = NH_QuestionDataSourceModel(array: data)

                        completion(newDataSource)


                    }



                }


            case .failure(let encodingError ):
                print(encodingError)

                //  if response.response?.statusCode == 404{

                print(encodingError.localizedDescription)

                completion(nil)

            }

        }}
我需要存储数组中的值:-[Yes,always,Yes,Times,No,I don’s Other],根据上面的函数,我写为:-

 case .success(let data):
                print("success",data)


                let result = response.result

                print(result)

                if     let wholedata = result.value as? [String:Any]{

                    print(wholedata)




                    if  let data = wholedata["data"] as? Array<[String:Any]>{

                        print(data)
                        print(response)

                  let options = data["options"] as? [String]
                  print(options)


                        let newDataSource:NH_QuestionDataSourceModel = NH_QuestionDataSourceModel(array: data)

                        completion(newDataSource)


                    }
但在存储期权时,会出现一些问题。如何解决? 这里我需要在数组中存储选项如何做?

关键数据的值是数组[[String:Any]]而不是NSArray,因此必须迭代数组

if let data1 = wholedata["data"] as? [[String:Any]] {
    for question in data1 {
        let options = question["options"] as! [String]
        print(options)
    }
}
但是,我建议将JSON解码为可解码的结构

使用可解码模型实体的标准方法

现在设计响应模型

class QuestionSetResponseModel: Decodable {
     var data: [QuestionSetModel]?
     enum CodingKeys: String, CodingKey {
         case data
     }
     required init(with decoder: Decoder) throws {
         let container = try decoder.container(keyedBy: CodingKeys.self)
         data = (try? container.decodeIfPresent([QuestionSetModel].self, forKey: .data)) ?? nil
     }
}
现在在你的Alamofire回复中

可能重复的
let jsonString = """
{"data":[{"id":35,"question":"How ARE u?","options":["Yes, always","Yes, sometimes","No","I did have any questions","Other"],"button_type":"2","option_count":"5"}]}
"""

struct Response : Decodable {
    let data: [Question]
}

struct Question: Decodable {
    let id: Int
    let question: String
    let options: [String]
    let buttonType, optionCount: String
}


let data = Data(jsonString.utf8)
do {
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    let result = try decoder.decode(Response.self, from: data)
    print(result.data)
} catch { print(error) }
class QuestionSetModel: Decodable {
    var id: Int?
    var question: String?
    var options: [String]?
    var buttonType: Int?
    var optionCount: Int?

    enum CodingKeys: String, CodingKey {
        case id = "id"
        case question = "question"
        case options = "options"
        case buttonType = "button_type"
        case optionCount = "option_count"
    }

    required init(with decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        id = (try? container.decodeIfPresent(Int.self, .id)) ?? nil
        question = (try? container.decodeIfPresent(String.self, .question)) ?? nil
        options = (try? container.decodeIfPresent([String].self), .options) ?? nil
        buttonType = (try? container.decodeIfPresent(Int.self, .buttonType)) ?? nil
        optionCount = (try? container.decodeIfPresent(Int.self, .optionCount)) ?? nil
    }
}
class QuestionSetResponseModel: Decodable {
     var data: [QuestionSetModel]?
     enum CodingKeys: String, CodingKey {
         case data
     }
     required init(with decoder: Decoder) throws {
         let container = try decoder.container(keyedBy: CodingKeys.self)
         data = (try? container.decodeIfPresent([QuestionSetModel].self, forKey: .data)) ?? nil
     }
}
// here you receive the response
switch result.response.statusCode {
case 200?:
       if let data = result.data,
          let questionResponse = try? JSONDecoder().decode(QuestionSetResponseModel.self,
                                                                          from: data) {

         // here you can access all the thing
         if let questions = questionResponse.data {
             for question in questions {
                 // here you got your question
                 if let options = question.options {
                    for option in options {
                        // here you get your options
                    }
                 }
             }
         }
  }
default:
       print("status code error")
}