Как получить доступ к конкретным данным массива после анализа файла JSON? - PullRequest
0 голосов
/ 03 сентября 2018

Вот JSON:

[
  {
    "District_en": "Kowloon City",
    "Name_en": "Carpenter Road Park",
    "GIHS": "9G5i7NFpXL",
    "Court_no_en": "4",
    "Court_no_cn": "4"
  },
  {
    "District_en": "Kowl",
    "Name_en": "Road Park",
    "GIHS": "9G5i7NFaXL",
    "Court_no_en": "5",
    "Court_no_cn": "6"
  }
]

Вот мой код:

func loadjson() {
        if let url = Bundle.main.url(forResource: "court", withExtension: "json"){
            do{
                let data = try Data(contentsOf: url)
                let decoder = JSONDecoder()
                let jsondata = try decoder.decode([Court].self, from: data)
                print(jsondata)
                } catch {
                print(error)
            }
        }
}

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

Ответы [ 3 ]

0 голосов
/ 03 сентября 2018

Когда вы получаете данные JSON, вам нужно преобразовать их в вашу модель Court. У Корта должен быть специальный инициализатор, который преобразует данные json в свойства модели. Как это:

struct Court: Codable {
   var district: String
   var name: String
   // and so on

   init?(json: [String: Any]) {
      guard let district = json["District_en"] as? String,
           let name = json["Name_en"] as? String else {
           return nil
       }

       self.district = district
       self.name = name
   }
}

Тогда вы можете получить свои модели из данных JSON:

let jsonData = try JSONSerialization.jsonObject(with: data, options: [])

if let json = jsonData as? [[String: Any]] {
      let array = json.compactMap(Court.init)

      print(array)
}
// Prints: [Court(district: "Kowloon City", name: "Carpenter Road Park"), Court(district: "Kowl", name: "Road Park")]
0 голосов
/ 05 сентября 2018

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

struct Court: Codable {

let addressCn : String?
let openingHoursCn : String?

enum CodingKeys: String, CodingKey {
    case addressCn = "Address_cn"
    case openingHoursCn = "Opening_hours_cn"

}
init(from decoder: Decoder) throws {
    let values = try decoder.container(keyedBy: CodingKeys.self)
    addressCn = try values.decodeIfPresent(String.self, forKey: .addressCn)
    openingHoursCn = try values.decodeIfPresent(String.self, forKey:.openingHoursCn)
}

класс TableTableViewController: UITableViewController {

var court = [Court]()

override func viewDidLoad() {
    super.viewDidLoad()
    fetchjson()
}


override func tableView(_ tableView: UITableView, numberOfRowsInSection    section: Int) -> Int {
    return court.count
}


func fetchjson() {
    if let url = Bundle.main.url(forResource: "facility-bkbc", withExtension: "json"){
        do{
            let data = try Data(contentsOf: url)
            let decoder = JSONDecoder()
            self.court = try decoder.decode([Court].self, from: data)
            print(court)
            self.tableView.reloadData()
        }catch{ print(error)}}}

}

0 голосов
/ 03 сентября 2018

Это как любой другой тип массива. Например:

if let decodedData = jsonData{
    print(decodedData.first)

    print(decodedData[1].name)
}

В первом отпечатке вы напечатаете объект "Carpenter Road Park". Во втором случае будет напечатано «Road Park» (если вы расшифровали «Name_en» как «name».

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