Многократный анализ JSON с разных URL в Swift - PullRequest
0 голосов
/ 20 февраля 2019

Я хочу проанализировать строки JSON с разных URL-адресов в моем приложении панели вкладок iOS:

  • Parsing.swift
  • FirstViewController.swift (начальный контроллер представления панели вкладок)
  • SecondViewController.swift
  • ...

В Parsing.swift у меня есть различные схемы struct (TopLevel) и enum Я контролировал в детской площадке: они работают отлично.В каждом 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 отображается с результатами анализа JSON из URL.Но теперь пришло время щелкнуть по второму элементу панели, чтобы открыть 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, представление таблицы'popolate и XCode выдает error : dataCorrupted (Swift.DecodingError.Context (codingPath: [], debugDescription: "Указанные данные не были действительными в формате JSON.", underError: Необязательно (Ошибка домена)= NSCocoaErrorDomain Code = 3840 "Текст JSON не начинался с массива или объекта и опция, позволяющая не устанавливать фрагменты." UserInfo = {NSDebugDescription = Текст JSON не начиналась с массива или объекта и опция, позволяющая не устанавливать фрагменты.}))) Но текст JSON действителен .

Я пробовал много решений: я изменил задачи на URLSession.shared, я использовал private struct и enum, я контролировалпеременные и стоимостные источники, ну, нет возможности правильно разобрать второй URL.Даже если я создаю НОВОЕ приложение Single View и копирую код 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 голосов
/ 21 февраля 2019

Ну, я решил проблему, изменив мой второй URL с "WWW.myserver.net/string2.json" на "myserver.net/string2.json", просто без WWW.Таким образом, обе задачи работают и анализируют соответствующие строки из разных URL.

0 голосов
/ 20 февраля 2019

Поскольку у меня нет доступа к ответу JSON и используемой модели.Я могу предположить несколько возможностей, которые могут вызвать эту проблему.

1) У вас есть модель и ответ JSON.Когда вы пытаетесь декодировать, в ответе JSON может быть любое поле с нулевым значением, и то же свойство в вашей модели не будет необязательным.

2) Модель может не иметь такую ​​же структуру (свойства), что и ответ JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...