Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 使用dataTaskPublisher的Swift API调用_Json_Swift_Api_Parsing_Networking - Fatal编程技术网

Json 使用dataTaskPublisher的Swift API调用

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

在使用dataTaskPublisher和从API提取数据方面取得了各种成功。 我遇到的问题是嵌套JSON。我可以获取简单的JSON,但类似于口袋妖怪API的东西,它在其中嵌套了JSON

任何建议都很好。 onappear://fetch完成是我挂断的部分

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
        }
    }

谢谢你的回复。不知道我怎么会错过,但你看。仍在学习,但感谢您的帮助!