Как разобрать SubReddits JSON, используя Codable - PullRequest
0 голосов
/ 14 февраля 2020

URL-адрес, который я использовал, был "https://www.reddit.com/subreddits/.json", который предоставит вам формат JSON Субредитов Reddit.

Мои модели кодируемой структуры следующие:

struct SubredditsData: Codable {
    let data: SubredditData
}

struct SubredditData: Codable {
    let children: [Children]
}

struct Children: Codable {
    let data: ChildrenData
}

struct ChildrenData: Codable {
    let title: String
    let icon_img: String
    let display_name_prefixed: String
    let name: String
}

и, конечно, Модель для Subreddit

struct SubredditsModel {
    let title: String
    let display_name_prefixed: String
    let name: String
}

Затем я выполнил запрос и сам фактический анализ

func parseSubRedditsJSON(_ subredditsRawData: Data) -> [SubredditsModel]? {
    let decoder = JSONDecoder()
    do {
        var subReddits = [SubredditsModel]()
        let decodedData = try decoder.decode(SubredditsData.self, from: subredditsRawData)
        let data = decodedData.data
        let children = data.children
        for item in children {
            let childrenData = item.data
            let title = childrenData.title
            let display_name_prefixed = childrenData.display_name_prefixed
            let name = childrenData.name
            let subReddit = SubredditsModel(title: title, display_name_prefixed: display_name_prefixed, name: name)
            subReddits.append(subReddit)
        }
        return subReddits
    } catch {
        subredditsDelegate?.didFailWithError(error: error)
        return nil
    }
}//end of parseSubRedditsJSON

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

let decodedData = try decoder.decode(SubredditsData.self, from: subredditsRawData)

В сообщении об ошибке говорится:

valueNotFound(Swift.String, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "data", intValue: nil), 
CodingKeys(stringValue: "children", intValue: nil), _JSONKey(stringValue: "Index 5", intValue: 5), 
CodingKeys(stringValue: "data", intValue: nil), 
CodingKeys(stringValue: "icon_img", intValue: nil)], 
debugDescription: "Expected String value but found null instead.", underlyingError: nil))

Я, должно быть, что-то упустил или не реализовал правильный способ синтаксического анализа используя Swift codable.

1 Ответ

1 голос
/ 14 февраля 2020

Поскольку некоторые поля не являются обязательными, для них может потребоваться строковый тип или значение NULL, что делает его необязательным, чтобы решить эту проблему.

struct SubredditsData: Codable {
    let data: SubredditData
 }

 struct SubredditData: Codable {
    let children: [Children]
 }

 struct Children: Codable {
   let data: ChildrenData
 }

 struct ChildrenData: Codable {
   let title: String?
   let icon_img: String?
   let display_name_prefixed: String?
   let name: String?
 }
...