Swift中来自不同URL的多个JSON解析

时间:2019-02-20 11:51:47

标签: ios json swift parsing

我想在我的iOS Tab Bar应用中解析来自不同URL的JSON字符串:

  • Parsing.swift
  • FirstViewController.swift(“初始”选项卡栏视图控制器)
  • SecondViewController.swift
  • ...

在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": " "
          }
      ]
} }

2 个答案:

答案 0 :(得分:0)

因为我无权使用JSON响应和Model。 我认为可能导致此问题的可能性很小。

1)您拥有模型和JSON响应。当您尝试解码时,JSON响应中可能有任何字段为null,并且模型中的相同属性不是可选的。

2)模型的结构(属性)可能与JSON响应不同。

答案 1 :(得分:0)

好吧,我解决了将我的第二个URL从“ WWW.myserver.net/string2.json”更改为“ myserver.net/string2.json”的问题,而没有使用WWW。这样,两个任务都可以工作,并且可以解析来自不同URL的相应​​字符串。