JSONDecoder在尝试解析嵌套JSON时返回错误

pbwdgjma  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(82)

在过去的几天里,我一直在尝试解析一个嵌套的JSON,但我不知道如何前进。
在这一点上,我怀疑问题是JSON中接收到的一个名为“data”的参数,这可能会导致结构“VTResponse”中的参数值和URLSession.shared.dataTask获取的数据参数之间的混淆。
下面是此时的代码:

import UIKit

struct VTResponse: Decodable {
    let data: [VT]
}

struct VT: Decodable {
    var id: String
}

let token = "<TOKEN>"
let XDOMAIN = "<XDOMAIN>"

guard let url = URL(string: "https://www.lalalla.com/subdomains") else {
            fatalError("Invalid URL")
}

var request = URLRequest(url: url)
request.httpMethod = "GET"
request.setValue("x-apikey: \(token)", forHTTPHeaderField: "Authorization")

URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else { return }

let result = try? JSONDecoder().decode(VTResponse.self, from: data)

if let result = result {
    result.data.forEach {
        print($0.id)
    }
            }
    else {
        print("Error")
    }
}.resume()

字符串
假设我为查询定义了一个token和domain,例如,查找“giphy.com“的所有subdomains,JSON响应:
JSON响应- Pastebin
正如你在JSON响应中看到的,subdomains参数(“id”)在一个字典下,在一个数组(“data”)下。我猜代码试图将数据分配给变量:

guard let data = data, error == nil else { return }


但这只是一个猜测。即使是这样,我怎么能解决这个问题呢?不管怎样,我得到了以下输出:
误差
我正在尝试获得以下输出:

pingback.giphy.com
media3.giphy.com
api.giphy.com
developers.giphy.com
media.giphy.com
x-qa.giphy.com
media1.giphy.com
x.giphy.com
media4.giphy.com
media0.giphy.com


有什么想法吗?

20jt8wwn

20jt8wwn1#

尝试使用x-apikey头作为令牌:

func fetchData(token: String, XDOMAIN: String, completion: @escaping (VTResponse) -> Void) {
    guard let url = URL(string: "https://www.virustotal.com/api/v3/domains/\(XDOMAIN)/subdomains") else {
        fatalError("Invalid URL")
    }
    
    var request = URLRequest(url: url)
    request.httpMethod = "GET"
    request.setValue("\(token)", forHTTPHeaderField: "x-apikey") // <-- here
    
    URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data else { return } // todo return some error msg
        do {
            let results = try JSONDecoder().decode(VTResponse.self, from: data)
            return completion(results)
        } catch {
            print(error) // <-- here important
        }
    }.resume()
}

字符串
像这样使用它:

fetchData(token: "xxx", XDOMAIN: "www") { results in
    results.data.forEach {
        print("---> id: \($0.id)")
    }
}


EDIT-1:要得到一个[String]的数组,也就是id的数组,使用这个函数:

func ListFromSubDomains(token: String, XDOMAIN: String, completion: @escaping ([String]) -> Void) {
    fetchData(token: token, XDOMAIN: XDOMAIN) { results in
        completion(results.data.map{ $0.id })
    }
}


这样使用它:

var IPList: [String] = []

ListFromSubDomains(token: "xxx", XDOMAIN: "www") { ids in
     IPList = ids
     print("---> ids: \(ids)")
}

相关问题