Разбор и массив объектов в JSON для объекта в Swift - PullRequest
0 голосов
/ 04 октября 2018

Эй, у меня есть следующий JSON:

{
    "monuments": [
        {
            "name": "Iglesia de Tulyehualco",
            "description": "No hay descripción",
            "latitude": 19.2544877,
            "longitude": -99.012157
        },
        {
            "name": "Casa de Chuyin",
            "description": "Casa de Jesús",
            "latitude": 119.2563629,
            "longitude": -99.0152632
        }
    ]
}

Я получаю следующий код, чтобы попытаться разобрать каждый объект, но я получаю сообщение об ошибке, что тип Any не имеет члена 'x'.

func loadMonuments() {
    if let path = Bundle.main.path(forResource: "monuments", ofType: "json") {
        do {
            let data = try Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe)
            let jsonResult = try JSONSerialization.jsonObject(with: data, options: .mutableLeaves)
            if let jsonResult = jsonResult as? Dictionary<String, AnyObject>, let monumentsJson = jsonResult["monuments"] as? [Any] {
                for m in monumentsJson {
                    print(m)
                }
            }
        } catch {
            // handle error
        }
    }
}

Я хочу получить каждое имущество памятника.

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

В Swift4 был введен Codable для сериализации, поэтому вы должны попытаться сделать ваши объекты кодируемыми следующим образом:

struct Monument: Codable {
  let name: String
  let description: String
  let latitude: String
  let longitude: String
}

А затем вы можете проанализировать объект с помощью этого:

func loadMonuments() -> [Monument] {
    guard let path = Bundle.main.path(forResource: "monuments", ofType: "json"),
       let data = try Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe)  else {
        return []
    }

    do {
        return try JSONDecoder().decode([Monument].self, from: data)
    } catch {
        print("error: \(error)")
        return []
    }
}
0 голосов
/ 04 октября 2018

Опция 1: (рекомендуется)

struct Root:Decodable { 
 let monuments:[InnerItem] 
}

struct InnerItem:Decodable { 
 let name:String
 let description:String
 let latitude:Doube
 let longitude:Double 
}

//

 do {
      let data = try Data(contentsOf: URL(fileURLWithPath: path), options:[])
      let content = try JSONDecoder().decode(Root.self,from:data)
      print(content)
 }
 catch {
  print(error)
 }

Опция 2:

if let jsonResult = jsonResult as? [String:Any] , let monumentsJson = jsonResult["monuments"] as? [[String:Any]] {
     for m in monumentsJson {
         print(m["name"])
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...