我正在尝试用swift 4解析json,请告诉我它有什么问题?
我试图使用以下方法解析JSON,但XCode在声明“data”时给了我一个错误 我是新来的,我不明白怎么了。请帮帮我我正在尝试用swift 4解析json,请告诉我它有什么问题?,json,parsing,struct,swift4,Json,Parsing,Struct,Swift4,我试图使用以下方法解析JSON,但XCode在声明“data”时给了我一个错误 我是新来的,我不明白怎么了。请帮帮我 import UIKit struct Contacts: Decodable { let id: Int let name: String let email: String } class ViewController: UIViewController { override func viewDidLoad() {
import UIKit
struct Contacts: Decodable {
let id: Int
let name: String
let email: String
}
class ViewController: UIViewController {
override func viewDidLoad()
{
super.viewDidLoad()
let urlString = "https://api.androidhive.info/contacts/"
guard let url = URL(string: urlString) else {return}
URLSession.shared.dataTask(with: url) { (data, response, error) in
}
guard let data = data else {return}
//let datastring = String(data: data, encoding: .utf8)
do
{
let contact = try JSONDecoder().decode([Contacts].self, from: data)
print(contact.name)
} catch let jsonErr {
print("Error deserializing json:", jsonErr)
}
}
}
三大问题
联系人
数组的字典id
的值是String
,而不是Int
一条严格的规则是:双引号中的所有内容都是
String
偶数“12”
和“false”
请试试这个,它对我有用
func getContactListsApiCalling() {
var request = URLRequest(url: URL(string: "https://api.androidhive.info/contacts/")!)
request.httpMethod = "GET"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
let session = URLSession.shared
let task = session.dataTask(with: request, completionHandler: { data, response, error -> Void in
do {
if let Data = data {
let responseJSON = try JSONSerialization.jsonObject(with: Data) as? Dictionary<String, AnyObject> ?? [:]
if let contacts = responseJSON["contacts"] as? [[String :AnyObject]] {
for contact in contacts {
let id = contact["id"] as? String ?? ""
let name = contact["name"] as? String ?? ""
let email = contact["email"] as? String ?? ""
let address = contact["address"] as? String ?? ""
let gender = contact["gender"] as? String ?? ""
print(id,name,email,address,gender)
}
}
}
} catch {
print("error")
}
})
task.resume()
}
func getContactListsApiCalling(){
var request=URLRequest(url:url(字符串):https://api.androidhive.info/contacts/")!)
request.httpMethod=“GET”
request.addValue(“应用程序/json”,forHTTPHeaderField:“内容类型”)
让session=URLSession.shared
让task=session.dataTask(带:request,completionHandler:{data,response,error->Void in)
做{
如果let Data=Data{
让responseJSON=try JSONSerialization.jsonObject(with:Data)作为字典??[:]
如果让contacts=responseJSON[“contacts”]作为?[[String:AnyObject]]{
用于联系人中的联系人{
让id=联系人[“id”]作为字符串??“
让name=联系人[“name”]作为?字符串??“
让email=contact[“email”]作为?字符串??“
让地址=联系人[“地址”]作为?字符串??“
让性别=联系人[“性别”]作为?字符串??“
打印(id、姓名、电子邮件、地址、性别)
}
}
}
}抓住{
打印(“错误”)
}
})
task.resume()
}
}您到底遇到了什么错误?你能给我们看一个服务器返回的JSON的例子吗?嘿,我是在youtuber的帮助下自己弄明白的。实际上,在这段代码中,我在url函数之外应用了do。。在那之后,它只是向我显示错误,我无法获得任何数据。那太好了。你应该在答案部分写下解决方案,让其他人向@MALIKK HABIB UR REHMAN学习(并放弃投票),如果可行,请让我知道。Rahul m很抱歉,我没有尝试你的代码,因为我的代码是在遵循@Vadian的建议后才起作用的。如果你现在需要代码,你可以使用它。谢谢,我注意到了。我理解你关于int和恢复任务的观点。。但是我不明白为什么我们要用树根???嘿,谢谢!按照你的建议去做,我的代码就行了。伙计们,这是一段代码,可以帮助你,以防有人想用Post方法获取数据。在这里,我使用post方法获取了对象的Json数组。
func getContactListsApiCalling() {
var request = URLRequest(url: URL(string: "https://api.androidhive.info/contacts/")!)
request.httpMethod = "GET"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
let session = URLSession.shared
let task = session.dataTask(with: request, completionHandler: { data, response, error -> Void in
do {
if let Data = data {
let responseJSON = try JSONSerialization.jsonObject(with: Data) as? Dictionary<String, AnyObject> ?? [:]
if let contacts = responseJSON["contacts"] as? [[String :AnyObject]] {
for contact in contacts {
let id = contact["id"] as? String ?? ""
let name = contact["name"] as? String ?? ""
let email = contact["email"] as? String ?? ""
let address = contact["address"] as? String ?? ""
let gender = contact["gender"] as? String ?? ""
print(id,name,email,address,gender)
}
}
}
} catch {
print("error")
}
})
task.resume()
}
//
// ViewController.swift
// PostMethodTest
//
// Created by HABIB UR REHMAN on 12/11/2018.
// Copyright © 2018 HABIB UR REHMAN. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
struct Resturant: Decodable {
var name: String
var deliveryCharges: String
var email: String
init(_ dictionary: [String: Any]) {
self.name = dictionary["name"] as? String ?? ""
self.deliveryCharges = dictionary["deliveryCharges"] as? String ?? ""
self.email = dictionary["email"] as? String ?? ""
}
}
override func viewDidLoad() {
super.viewDidLoad()
guard let url = URL(string: "your Link Here ") else { return }
var request = URLRequest(url: url)
request.httpMethod = "POST"
let task = URLSession.shared.dataTask(with: request) {(data, response, error) in
guard let dataResponse = data,
error == nil else {
print(error?.localizedDescription ?? "Response Error")
return }
do{
//here dataResponse received from a network request
let jsonResponse = try JSONSerialization.jsonObject(with:
dataResponse, options: [])
print(jsonResponse) //Response result
} catch let parsingError {
print("Error", parsingError)
}
}
task.resume()
}
}