给定的数据不是有效的 JSON

Posted

技术标签:

【中文标题】给定的数据不是有效的 JSON【英文标题】:The given data was not valid JSON 【发布时间】:2022-01-22 04:55:08 【问题描述】:

当我在终端中仅使用 URL 发出 curl 请求时,它工作正常,但是当我尝试使用 URLSession 执行它时,它失败并且似乎没有检索到任何数据。

我的 JSON 结构是这样的:


  "access_token": "x123",
  "expires_in": 3599,
  "scope": "x123",
  "token_type": "Bearer"

这是我的服务文件:

struct Welcome: Codable 
    let tokens: [Token]


struct Token: Codable 
    let accessToken: String
    let expiresIn: String
    let scope: String
    let tokenType: String

    enum CodingKeys: String, CodingKey 
        case accessToken = "access_token"
        case expiresIn = "expires_in"
        case scope
        case tokenType = "token_type"
    


class RefreshToken: ObservableObject 
    
    @Published var refreshToken = [Token]()
    
    func getRefresh() 
        guard let url = URL(string: "url-redacted") else return
        
        var request = URLRequest(url: url)

        URLSession.shared.dataTask(with: request)  (theData, response, error) in
            guard error == nil else print(error!.localizedDescription); return 
            // guard let data = data else print("empty data"); return 

            let theData = try! JSONDecoder().decode(Welcome.self, from: theData!)
            DispatchQueue.main.async 
                self.refreshToken = theData.tokens
                
            
            
        
        .resume()



正如我所说,当使用带有 curl 请求的终端时,响应很好,但使用 URLSession 它失败了,我的文件可以构建,但它在构建后退出并出现错误消息 The given data was not valid JSON

【问题讨论】:

你试过读取theData转换成UTF8字符串的内容吗? 您不应该在可能失败的情况下使用try!。您应该更喜欢正确的do try ... catch print(error) // handle error 。这也将为您提供实际的错误描述。 @EmilioPelaez 我不确定要采取什么步骤来做到这一点? 【参考方案1】:

如果json返回Token,为什么你解码为Welcome? 尝试解码为Token.self

而且,当您声明时,json 似乎将 expires_in 返回为 Int

let expiresIn: String // -> This should be Int

【讨论】:

以上是关于给定的数据不是有效的 JSON的主要内容,如果未能解决你的问题,请参考以下文章

Swift 5:给定的数据不是有效的JSON(将数据从API加载到表格视图)

如何检查给定字符串是不是是Java中的有效JSON

在 android 中收到的 FCM 数据有效负载不是 json 格式

正则表达式查找部分输入是不是为有效 JSON

angular 1 promise call http 有效,但不适用于来自 json 结构的假数据,promise.then 不是函数

如果我在 ERD 中表示 JSON 模型是不是有效?