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")
}