如何在 Swift 4 中解码 JSON(JSON Web 令牌)?
Posted
技术标签:
【中文标题】如何在 Swift 4 中解码 JSON(JSON Web 令牌)?【英文标题】:How do I decode JSON(JSON Web Token) in Swift 4? 【发布时间】:2017-10-25 20:23:24 【问题描述】:如何在 Swift 4 中使用解码器解码这个 json? 我希望能够自己获取“令牌”,以便将其存储在钥匙串中。
"success":true,
"token":"***"
,
"user":
"id": "59f0ec6d5479390345980cc8",
"username": "john",
"email": "john@gmail.com"
我试过了,但是什么都打印不了。
let session = URLSession.shared
let task = session.dataTask(with: request) (data, _, _) in
guard let data = data else return
do
let jsonwt = try JSONDecoder().decode(JWT.self, from: data)
print(jsonwt.token)
catch
task.resume()
我可以把这个放在 catch 之后,但是这样会得到整个 json,我不想要那个。
print(String(data: data, encoding: .utf8)!)
这里是结构。我认为这就是问题所在。
struct User: Decodable
let id: String
let username: String
let email: String
struct JWT: Decodable
let success: String
let token: String
let user: User
【问题讨论】:
你有没有尝试过?success
不是String
,它似乎是Bool
类型
有几种方法可以解决这个问题。这是长期存在的争论之一,尤其是在 ios 中。 Swift 4 有一些内置的解决方案(如果我没记错的话)。我建议查看这些 API,然后再提出一个更具体的问题。这是一个很好的起点:developer.apple.com/swift/blog/?id=37 .
请查看***.com/questions/46867699/…
我强烈推荐使用json4swift.com 为json 响应生成类。节省大量时间...
【参考方案1】:
像这样工作:
struct User : Codable
var id : String
struct JWT : Codable
var success : Bool
var token : String
var user :User
let json = """
\"success\" : true,
\"token\" : \"***\",
\"user\":
\"id\": \"59f0ec6d5479390345980cc8\",
\"username\": \"john\",
\"email\": \"john@gmail.com\"
"""
let decoder = JSONDecoder()
let jwt = try decoder.decode(JWT.self, from: json.data(using: .utf8)!)
print ("token: \(jwt.token)")
【讨论】:
只需将“成功”更改为布尔值。【参考方案2】:这里有一些操场代码,演示了在 Swift 中解析 JSON 的代码:
//: Playground - noun: a place where people can play
import UIKit
import XCTest
import PlaygroundSupport
let json = """
"success":true,
"token":"***"
,
"user":
"id": "59f0ec6d5479390345980cc8",
"username": "john",
"email": "john@gmail.com"
""".data(using: .utf8)!
do
if let data = try JSONSerialization.jsonObject(with: json, options: .allowFragments) as? [String:Any], let token = data["token"]
print("token is \(token)")
catch _
print("Failed to decode JSON")
【讨论】:
以上是关于如何在 Swift 4 中解码 JSON(JSON Web 令牌)?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 swift 4.1 和 xcode 9.3 中使用 JSONDecoder 解码嵌套的 JSON 数组和对象?