Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.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
Ios JSON解码器使用URLSession失败_Ios_Json_Swift_Urlrequest - Fatal编程技术网

Ios JSON解码器使用URLSession失败

Ios JSON解码器使用URLSession失败,ios,json,swift,urlrequest,Ios,Json,Swift,Urlrequest,这周对斯威夫特来说是个新手,正在努力学习斯威夫特UI。尝试从笑话API获取请求,并最终在每次按下按钮时刷新请求 我感觉我的结构定义不正确,或者可能没有正确解码返回的数据。我可以打印数据字符串(作为json字典),但不能通过Swift访问值本身 导入快捷界面 结构响应:可编码{ var笑话:[笑话] } 结构笑话:可编码{ 变量设置:字符串 变量传递:字符串 } 结构ContentView:View{ @国家私有变量joke=[joke]() func loadData(){ guard let

这周对斯威夫特来说是个新手,正在努力学习斯威夫特UI。尝试从笑话API获取请求,并最终在每次按下按钮时刷新请求

我感觉我的结构定义不正确,或者可能没有正确解码返回的数据。我可以打印数据字符串(作为json字典),但不能通过Swift访问值本身

导入快捷界面
结构响应:可编码{
var笑话:[笑话]
}
结构笑话:可编码{
变量设置:字符串
变量传递:字符串
}
结构ContentView:View{
@国家私有变量joke=[joke]()
func loadData(){
guard let url=url(字符串:https://sv443.net/jokeapi/v2/joke/Dark?type=twopart)其他{
打印(“无效URL”)
返回
}
URLSession.shared.dataTask(with:url){data,res,中出现错误
如果let data=data{
打印(“解码…”)
让str=String(数据:数据,编码:.utf8)
打印(str!)
如果let decodedResponse=try?JSONDecoder().decode(Response.self,from:data){
打印(“已解码!”)
//无法打印此文件
打印(解码响应。笑话)
//看起来不错,我们走吧
返回
}
}
打印(“提取失败:\(错误?.localizedDescription??“未知错误”))
}1.简历()
}
var body:一些观点{
文本(“测试”)
.onAppear(执行:loadData)
}
}
结构内容视图\u预览:PreviewProvider{
静态var预览:一些视图{
ContentView()
}
}
解码。。。
{
“类别”:“黑暗”,
“类型”:“两部分”,
“设置”:“当我还是个孩子的时候,我和奶奶做了一个很大的沙堡。”,
“递送”:“不幸的是,在火葬仪式上没有给任何人留下深刻印象……”,
“旗帜”:{
“nsfw”:错误,
“宗教”:假,
"政治":假,,
“种族主义者”:错误,
“性别歧视”:错误
},
“id”:145,
“错误”:错误
}
获取失败:未知错误
可能只是一个愚蠢的错误,我没有抓住,但我想一些解释,甚至一些文件。我看到的唯一文档/教程是展示如何使用特定结构的JSON响应。我拉的那本词典的词根是字典,所以我想这就是差异所在


我假设我会在UI中使用@escaping进行渲染?

问题是您试图解码数组:

struct Response : Codable {
    var joke: [Joke]
}

struct Joke : Codable {
    var setup: String
    var delivery: String
}
struct Response : Codable {
    var setup: String
    var delivery: String
}
然而,JSON响应只是一个对象

解决方案可能是将其解码为对象而不是数组:

struct Response : Codable {
    var joke: [Joke]
}

struct Joke : Codable {
    var setup: String
    var delivery: String
}
struct Response : Codable {
    var setup: String
    var delivery: String
}
或者,将解码部分更改为解码一个
笑话

let decodedResponse = try? JSONDecoder().decode(Joke.self, from: data)

他的结构模型不也需要覆盖JSON的所有字段吗?@rs7您只能指定所需的字段。合成的
init(来自解码器:)
实现将只在解码器中查找
设置
交付
。其他JSON字段将被忽略。不要使用
try?
-这将隐藏任何解码错误。使用
do/try/catch
可以捕获任何解码错误并将其打印出来,查看出了什么问题。