我想在我的iOS Tab Bar应用中解析来自不同URL的JSON字符串:
在Parsing.swift中,我有各种在Playground中控制的 struct (TopLevel)和枚举方案:它们完美地工作。在每个ViewController中,我都有一个要填充不同JSON解析结果的表视图。这是我的简化代码:
FirstViewController.swift viewDidLoad()
let url = // my first URL to parse
let urlObj = URL(string: url)
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
let task = session.dataTask(with: urlObj!) { (data, response, error) in
do {
let results = try JSONDecoder().decode(TopLevel.self, from: data!)
... for ...
self.table.reloadData()
}
catch {
...
}
}
task.resume()
此代码完全有效:当应用首次打开时,FirstViewController中的表视图会填充URL的JSON解析结果。但是现在该单击第二个Bar Item来打开SecondViewController了。该代码显然是:
SecondViewController.swift viewDidLoad()
let url2 = // my second URL to parse
let urlObj2 = URL(string: url2)
let config2 = URLSessionConfiguration.default
let session2 = URLSession(configuration: config2)
let task2 = session.dataTask(with: urlObj2!) { (data2, response2, error2) in
do {
let results2 = try JSONDecoder().decode(TopLevel.self, from: data2!)
... for ...
self.table2.reloadData()
}
catch {
...
}
}
task2.resume()
好吧,当我点击第二个选项卡栏项以打开SecondViewController时,表视图不会出现,并且XCode给出了一个错误: dataCorrupted(Swift.DecodingError.Context(codingPath: [],debugDescription:“给定的数据不是有效的JSON。”,底层错误:可选(错误域= NSCocoaErrorDomain代码= 3840“ JSON文本不是以数组或对象开头,并且没有允许设置片段的选项。” UserInfo = {NSDebugDescription = JSON文本不是以数组或对象开头,并且没有允许设置片段的选项。}))但是JSON文本有效。
我尝试了很多解决方案:我将任务更改为URLSession.shared,使用了私有结构和枚举,控制了变量和成本,但是,没有办法正确地解析第二个URL。即使我创建了一个新的Single View App,并且将SecondViewController.swift代码复制到viewDidLoad()函数中,它也可以完美地运行,因此,同样,第二个URL JSON也不成问题字符串是有效。我认为这两个解析任务之间存在干扰,看起来第一个破坏了第二个。我能做什么?谢谢。
编辑:这是我的JSON(所有字段均为有效字符串,为简化起见,我已将其删除)
{
"attributes": {
"version": "2.0",
"nodeValue": "\n"
},
"channel": {
"title": " ",
"link": " ",
"description": " ",
"lastBuildDate": " ",
"language": " ",
"copyright": " ",
"item": [
{
"title": " ",
"link": " ",
"guid": {
"attributes": {
"isPermaLink": "false",
"nodeValue": " "
}
},
"pubDate": " ",
"category": " "
},
{
"title": " ",
"link": " ",
"guid": {
"attributes": {
"isPermaLink": "false",
"nodeValue": " "
}
},
"pubDate": " ",
"category": " "
}
]
} }
答案 0 :(得分:0)
因为我无权使用JSON响应和Model。 我认为可能导致此问题的可能性很小。
1)您拥有模型和JSON响应。当您尝试解码时,JSON响应中可能有任何字段为null,并且模型中的相同属性不是可选的。
2)模型的结构(属性)可能与JSON响应不同。
答案 1 :(得分:0)
好吧,我解决了将我的第二个URL从“ WWW.myserver.net/string2.json”更改为“ myserver.net/string2.json”的问题,而没有使用WWW。这样,两个任务都可以工作,并且可以解析来自不同URL的相应字符串。