Как получить значение sub из этого анализа JSON? - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь получить конкретное вспомогательное значение из JSON, который я написал. JSON выглядит так:

{
    "name":"Tour of Honor Bonus Listing",
    "version":"18.1.3",
    "bonuses": [  
       {  
          "bonusCode":"AZ1",
          "category":"ToH",
          "name":"Anthem Tour of Honor Memorial",
          "value":1,
          "city":"Anthem",
          "state":"AZ",
          "flavor":"Flavor Text Goes Here",
          "imageData":"Base64 Text Goes Here"
      },
      {  
          "bonusCode":"AZ2",
          "category":"ToH",
          "name":"Benson Tour of Honor Memorial",
          "value":1,
          "city":"Benson",
          "state":"AZ",
          "flavor":"Flavor Text Goes Here",
          "imageData":"Base64 Text Goes Here"
      }
    ]
}

В моем файле BonusTableViewController.swift в разделе viewDidLoad я использую следующее:

let loadedBonuses = loadJson(filename: "BonusData")
print(loadedBonuses as Any)

И эта loadJson функция выглядит так:

func loadJson(filename fileName: String) -> [Bonuses]? {
        if let url = Bundle.main.url(forResource: fileName, withExtension: "json") {
            do {
                let data = try Data(contentsOf: url)
                let decoder = JSONDecoder()
                let jsonData = try decoder.decode(JSONData.self, from: data)
                print("loadJson loaded JSON")
                return jsonData.bonuses
            } catch {
                print("error:\(error)")
            }
        }
        return nil
    }

Файл JSON называется BonusData.json и находится в комплекте приложения.

Приведенный выше код работает как есть, и в консоли я получаю полный вывод массива бонусов из JSON. Однако я хочу, чтобы он печатал только значение BonusCode. Я пытался print(loadedBonuses.bonusCode as Any), но я получаю сообщение об ошибке,

Значение типа '[BonusTableViewController.Bonuses]?' не имеет члена 'Бонусный'

Я пробовал другие варианты, но все они дают мне ту же ошибку. Если это помогает, структура выглядит следующим образом:

// Bonus Data Structs
    struct JSONData: Decodable {
        let name: String
        let version: String
        let bonuses: [Bonuses]
    }
    struct Bonuses: Decodable {
        let bonusCode: String
        let category: String
        let name: String
        let value: Int
        let city: String
        let state: String
        let flavor: String
        let imageData: String
    }

Что я делаю не так?

1 Ответ

0 голосов
/ 30 апреля 2018

Ошибка ясна, [BonusTableViewController.Bonuses] - это массив (см. Скобки).

Вы должны использовать цикл

for bonus in loadedBonuses! {
    print(bonus.bonusCode)
}

или отобразить значения в другой массив

let bonusCodes = loadedBonuses!.map { $0.bonusCode }
print(bonusCodes)

Примечание. Блок do - catch не имеет смысла, поскольку файл находится в комплекте и должен существовать. Заставь все развернуть. В случае сбоя кода обнаруживается ошибка проектирования.

func loadJson(filename: String) -> [Bonuses] {
     let url = Bundle.main.url(forResource: fileName, withExtension: "json")!
     let data = try! Data(contentsOf: url)
     let jsonData = try! JSONDecoder().decode(JSONData.self, from: data)
     print("loadJson loaded JSON")
     return jsonData.bonuses
}
...