Ios 如何获取结构中的数据
我的json响应是Ios 如何获取结构中的数据,ios,swift,Ios,Swift,我的json响应是 { "success" : "1", "totalpage" : "2", "blogdata" : [ { "int_glocode" : "18", "var_blogtitle" : "ssss", "tblogdescription" : "ssssss", "var_images" : "http//url", "
{
"success" : "1",
"totalpage" : "2",
"blogdata" : [
{
"int_glocode" : "18",
"var_blogtitle" : "ssss",
"tblogdescription" : "ssssss",
"var_images" : "http//url",
"dt_creatdate" : "21-8-2017",
"flag" : "false"
}
{
"int_glocode" : "19",
"var_blogtitle" : "ssss",
"tblogdescription" : "ssssss",
"var_images" : "http//url",
"dt_creatdate" : "21-8-2017",
"flag" : "false"
}
]
}
我的密码是这个。我在这段代码中使用了alamofire和swiftyjson
struct Data:Decodable {
var var_image: String
var tblogdescription : String
var var_blogtitle: String
init(blogdata:[String:Any]) {
self.var_blogtitle = blogdata["var_blogtitle"] as! String
self.tblogdescription = blogdata["tblogdescription"] as! String
self.var_image = blogdata["var_image"] as! String
}
}
我使用这个数组来存储数据
var datadetail = [Data]()
那么我的json部分是
Alamofire.request("url", method: .post, parameters: ["API":"get_blog_list","user_id":"18","page":"1"], encoding: URLEncoding.default).responseJSON { (response) in
guard let datastring = response.result.value else { return }
if let data = datastring as? [String: Any] {
if let data1 = data["blogdata"] as? [[String:Any]] {
for data2 in data1 {
if let data3 = data2 as? [String: Any] {
let var_blogtitle = data3["var_blogtitle"] as? String
let var_image = data3["var_image"] as? String
let tblogdescription = data3["tblogdescription"] as? String
self.datadetail.append(Data(blogdata: tblogdescription))
self.datadetail.append(Data(blogdata: var_image))
self.datadetail.append(Data(blogdata: var_blogtitle))
}
else{
print("Error")
}
}
}
}
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return datadetail.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! detailsTableViewCell
let value = datadetail[indexPath.row]
cell.descriptionlabel.text = value.tblogdescription
cell.titlelabel.text = value.var_blogtitle
return cell
}
我想将var_blogtile、var_image、tblogdescription的数据添加到结构中,以便在表视图中显示该数据。我尝试了这个代码,得到了回应。我得到了var_blogtile、var_image和tblogdescription数据,但在append部分出现了错误。我想我的结构部分错了。请帮帮我。提前谢谢。更改结构名称
struct Values:Decodable {
var var_image: String
var tblogdescription : String
var var_blogtitle: String
init(blogdata:[String:Any]) {
self.var_blogtitle = blogdata["var_blogtitle"] as! String
self.tblogdescription = blogdata["tblogdescription"] as! String
self.var_image = blogdata["var_image"] as! String
}
}
及
这是tableview的一部分
Alamofire.request("url", method: .post, parameters: ["API":"get_blog_list","user_id":"18","page":"1"], encoding: URLEncoding.default).responseJSON { (response) in
guard let datastring = response.result.value else { return }
if let data = datastring as? [String: Any] {
if let data1 = data["blogdata"] as? [[String:Any]] {
for data2 in data1 {
if let data3 = data2 as? [String: Any] {
let var_blogtitle = data3["var_blogtitle"] as? String
let var_image = data3["var_image"] as? String
let tblogdescription = data3["tblogdescription"] as? String
self.datadetail.append(Data(blogdata: tblogdescription))
self.datadetail.append(Data(blogdata: var_image))
self.datadetail.append(Data(blogdata: var_blogtitle))
}
else{
print("Error")
}
}
}
}
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return datadetail.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! detailsTableViewCell
let value = datadetail[indexPath.row]
cell.descriptionlabel.text = value.tblogdescription
cell.titlelabel.text = value.var_blogtitle
return cell
}
如果您不确定api中是否有值,请将“始终”设置为可选
struct Data:Decodable {
var var_image: String?
var tblogdescription : String?
var var_blogtitle: String?
init(blogdata:[String:Any]) {
self.var_blogtitle = blogdata["var_blogtitle"] as? String
self.tblogdescription = blogdata["tblogdescription"] as? String
self.var_image = blogdata["var_image"] as? String
}
}
如果仍然出现错误,请编辑问题并显示错误使用以下格式的结构作为回答。如果不确定属性是否每次都会出现,请将其保留为可选
struct Response: Decodable {
var success: String
var totalpage: String
var blogdata: [BlogData]
}
struct BlogData: Decodable {
var int_glocode: String
var var_blogtitle: String?
var tblogdescription: String?
var var_images: String?
var dt_creatdate: String?
var flag: String
}
只需将响应
模式中的响应解析为:
var responseModal = Response()
if let data = response.result.value as? [String: Any] {
do {
let jsonData = try JSONSerialization.data(withJSONObject: data, options: .prettyPrinted)
responseModal = try JSONDecoder().decode(Response.self, from: jsonData)
} catch {
print(error)
}
}
更改ios中可用的默认数据属性struct name,并初始化您的[String:Any]不可变的任何名称struct as
Data
。它可能与现有的SwiftData
struct冲突。如果我使用这个数组var datadetail=[Values]()。然后我打印datadetail,以便在datadetail write?中获得附加值,然后在表视图中获取值,如下所示。cell.datalabel.text=datadetail[indexath.row].var\u blogtitle。这个标题显示在tableview中。写入?但当我在输出中打印datadetail时,[]中没有数据。请检查我编辑的答案,并确保数组datadetail有值。更改后,我在print语句中获得了数据,但在表数据中没有。为什么BlogData
中的所有成员都是可选的?JSON清楚地包含字典中的所有字段。是的,我保留它是为了表明如果键根本不出现,我们可以处理这种情况。@vadian,更新了structResponse
的答案以及structBlogData
的一些键。