我正在解析像这样的JSON
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
page.on('response', res => {
res.text().then(text => {
console.log('response:', {
url: res.url(),
status: res.status(),
res_headers: res.headers(),
req_headers: res.request().headers(),
text: text
});
});
});
await page.setBypassCSP(true);
await page.goto(url, {waitUntil: 'networkidle0'});
let content = await page.content();
await browser.close();
return content;
})();
这很好,但是我一直试图在周末学习泛型。我正在尝试编写一个方法,我传入一个Codable结构类型和一个JSON字符串,它返回我想要的类型的对象。
我尝试过以下方法: -
struct ExampleStruct : Codable {
init() {
}
// implementation
}
if let jsonData = jsonString.data(using: .utf8) {
do {
let decoder = JSONDecoder()
let object = try decoder.decode(ExampleStruct.self, from: jsonData)
} catch {
print("Coding error - \(error)")
}
}
然后当我想做上述
时func getType<T>(_ anyType: T.Type, from jsonString:String) -> T? {
if let jsonData = jsonString.data(using: .utf8) {
do {
let decoder = JSONDecoder()
let object = try decoder.decode(anyType, from: jsonData)//Errors here
return object as? T
return nil
} catch {
print("Coding error - \(error)")
return nil
}
}
return nil
}
但是在let = object行上我得到以下错误
无法将'T'类型的值(全局函数'getType(:from :)'的泛型参数)转换为预期的参数类型'T'(实例方法的通用参数'decode(:自:)')
和
在参数类型'T.Type'中,'T'不符合预期类型'Decodable'
正如我所说的那样,我本周末一直在努力学习仿制药,但我的理解显然已经明显受到阻碍。有没有解决这个问题,确实是我正在尝试做甚至可能或一个好主意?
答案 0 :(得分:5)
首先,强烈建议将throw
功能的错误移交给来电者。
从UTF8字符串创建的所有Data
中的第二个永远不会失败。
您必须将通用类型约束为Decodable
,不需要将该类型作为额外参数传递。
您的功能可以缩减为
func getType<T : Decodable>(from jsonString:String) throws -> T {
let jsonData = Data(jsonString.utf8)
return try JSONDecoder().decode(T.self, from: jsonData)
}