Json 使用dataTaskPublisher的Swift API调用
在使用dataTaskPublisher和从API提取数据方面取得了各种成功。 我遇到的问题是嵌套JSON。我可以获取简单的JSON,但类似于口袋妖怪API的东西,它在其中嵌套了JSON 任何建议都很好。 onappear://fetch完成是我挂断的部分Json 使用dataTaskPublisher的Swift API调用,json,swift,api,parsing,networking,Json,Swift,Api,Parsing,Networking,在使用dataTaskPublisher和从API提取数据方面取得了各种成功。 我遇到的问题是嵌套JSON。我可以获取简单的JSON,但类似于口袋妖怪API的东西,它在其中嵌套了JSON 任何建议都很好。 onappear://fetch完成是我挂断的部分 import SwiftUI import Combine struct Pokemon: Codable { var cards: Card } struct Card: Codable { var id: String
import SwiftUI
import Combine
struct Pokemon: Codable {
var cards: Card
}
struct Card: Codable {
var id: String
var name: String
}
struct ContentView: View {
@State private var requests = Set<AnyCancellable>()
@State var pokemon: Pokemon
var body: some View {
VStack {
Text("card name here")
}
.onAppear {
let url = URL(string: "https://api.pokemontcg.io/v1/cards")!
self.fetch(url, defaultValue: [Pokemon]()) {
self.pokemon = $0
}
}
}
func fetch<T: Decodable>(_ url: URL, defaultValue: T, completion: @escaping (T) -> Void) {
let decoder = JSONDecoder()
URLSession.shared.dataTaskPublisher(for: url)
.retry(1)
.map(\.data)
.decode(type: T.self, decoder: decoder)
.replaceError(with: defaultValue)
.receive(on: DispatchQueue.main)
.sink(receiveValue: completion)
.store(in: &requests)
}
}
导入快捷界面
进口联合收割机
结构口袋妖怪:可编码{
var卡:卡
}
结构卡:可编码{
变量id:String
变量名称:String
}
结构ContentView:View{
@State private var requests=Set()
@状态变量口袋妖怪:口袋妖怪
var body:一些观点{
VStack{
文本(“此处为卡片名称”)
}
奥纳佩尔先生{
让url=url(字符串:https://api.pokemontcg.io/v1/cards")!
fetch(url,defaultValue:[Pokemon]()){
self.pokemon=$0
}
}
}
func fetch(url:url,defaultValue:T,completion:@escaping(T)->Void){
let decoder=JSONDecoder()
URLSession.shared.dataTaskPublisher(用于:url)
.重试(1)
.map(\.data)
.解码(类型:T.self,解码器:解码器)
.replaceError(带:defaultValue)
.receive(在:DispatchQueue.main上)
.sink(接收值:完成)
.store(在:&请求中)
}
}
密钥“cards”是一个对象数组,因此您需要将口袋妖怪更新为以下内容
struct Pokemon: Codable {
var cards : [Card]
}
由于JSON的根是字典而不是数组,请将.onAppear
函数更新为
.onAppear {
let url = URL(string: "https://api.pokemontcg.io/v1/cards")!
self.fetch(url, defaultValue: Pokemon(cards: [Card(id: "default", name: "default")])) {
self.pokemon = $0
}
}
谢谢你的回复。不知道我怎么会错过,但你看。仍在学习,但感谢您的帮助!