如何在 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 数组和对象?

如何解码包含数组 Swift 4 的 JSON 文件?

如何在 Swift 4 中为 JSON 编写可解码,其中键是动态的?

Swift 4 可解码的 json 数组

如何从 Swift 4 中的解码器容器中获取未解码的属性?

Swift 4 解码简单的根级 json 值