快速将 JSON 响应转换为结构
Posted
技术标签:
【中文标题】快速将 JSON 响应转换为结构【英文标题】:Converting JSON response to a struct in swift 【发布时间】:2018-12-26 13:36:06 【问题描述】:我是 swift 编程新手,正在尝试从服务器获取 JSON 格式的用户数据,然后将其“粘贴”到结构中:
这是我的 api:
app.get('/getUser/:username',(req,res)=>
let user = req.params;
var sql = "SELECT * FROM users WHERE username = ? ";
mysqlConnection.query(sql,[user.username],
function(err, rows)
if(!err)
res.send(JSON.stringify("userID" : rows));
else
console.log(err)
);
);
这是 JSON 响应:
userID = (
email = test;
id = 1;
money = 200;
password = test;
username = test;
);
这是我的 apiCall 函数:
class func getUser(username :String)
let url = "http://127.0.0.1:3000/getUser/"+username
Alamofire.request(url).responseJSON(completionHandler : (response) in
switch response.result
case .success( _):
// I want to append the user struct by the user data collected from JSON
print(response.result.value!)
case .failure(let error):
print (error)
)
这是我的结构:
struct user
var id : String
var username : String
var password : String
var email : String
var money : String
我尝试在 MainPageViewController 中创建一个数组,然后附加它,但我不知道如何:
class MainPageViewController: UIViewController
var currentUser : String?
var userData = [user]()
override func viewDidLoad()
API.getUser(username: currentUser!)
print(currentUser!)
super.viewDidLoad()
// API.getUserID(username: currentUser!)
// Do any additional setup after loading the view.
【问题讨论】:
最好的方法是使用可编码... 您的问题不明确,因为从字典输出中您无法确定id
和money
的类型是String
还是Int
嘿 louay baccary 请分享您使用的答案/解决方案,目前,我被困在同一阶段
【参考方案1】:
最好的方法是使用 Codeable:
let data: YourJSONData
struct User: Codable
var id: String
var username: String
var password: String
var email: String
var money: String
let user = try? JSONDecoder().decode(User.self, from: data)
编辑
要回答您的进一步问题,请像这样使用它:
static func getUserByUsername(_ username: String)
let url = "http://127.0.0.1:3000/getUser/" + username
Alamofire.request(url).responseData(completionHandler : (response) in
switch response.result
case .success( let data):
do
let user = try JSONDecoder().decode(Base.self, from: data)
catch print(error)
case .failure(let error):
print (error)
)
struct Base: Codable
let userID: [User]
struct User: Codable
var id: String
var username: String
var password: String
var email: String
var money: String
【讨论】:
我该如何使用它?将此代码放在哪里以及如何将其与我的 api 相关联 你想要的任何地方......现在它是一个代表用户的本机结构...... 如果你不忽略它,这会抛出一个DecodingError
。
嗯,和你上面写的完全一样?!? @Sh_Khan
我做了responseData
而不是responseJSON
,而且这里不适合struct
【参考方案2】:
你可以试试
struct Root: Codable
let userID: [User]
struct User: Codable
let email: String
let id, money: Int
let password, username: String
do
let res = try JSONDecoder().decode(Root.self,from:data)
users = res.userID
catch
print(error)
并将 Alamofire 从 responseJSON
更改为 responseData
Alamofire.request(url).responseData(completionHandler : (response) in
switch response.result
case .success( let data):
// I want to append the user struct by the user data collected from JSON
print(response.result.value!)
do
let res = try JSONDecoder().decode(Root.self,from:data)
userData = res.userID
catch
print(error)
case .failure(let error):
print (error)
)
【讨论】:
我不明白,我的问题是我想将数据从 JSON 转换为字符串,然后将其附加到我的结构中 那么 Swift 中的 JSON 只是一个字符串……你必须将它序列化为一个结构体,然后你可以将它用作结构体,无论你想做什么……以上是关于快速将 JSON 响应转换为结构的主要内容,如果未能解决你的问题,请参考以下文章
使用 Swift 4 Decodable 将字符串 JSON 响应转换为布尔值