Как создать коллекцию объектов из JSON - PullRequest
0 голосов
/ 24 августа 2018

Я изучаю Swift и хочу создать приложение, которое будет показывать GPS-координаты автобусов на карте. Шины lat и lon взяты из JSON (отрывок ниже):

    {
   "result":[
      {
         "Lat":52.276408,
         "Lon":21.167618,
         "Time":"2018-08-24 11:50:05",
         "Lines":"225",
         "Brigade":"4"
      },
      {
         "Lat":52.222656,
         "Lon":21.102633,
         "Time":"2018-08-24 11:51:03",
         "Lines":"225",
         "Brigade":"2"
      },
      {
         "Lat":52.2100185,
         "Lon":21.2054211,
         "Time":"2018-08-24 11:51:08",
         "Lines":"119",
         "Brigade":"2"
      },
      {
         "Lat":52.1676735,
         "Lon":21.2222606,
         "Time":"2018-08-24 11:51:07",
         "Lines":"213",
         "Brigade":"3"
      }
    ]
}

Я думал о создании класса Bus

class Bus {

    var latitude : Double = 1.11
    var longitude : Double = 2.22
    var lines : Int = 0

    init (lat: Double, lon: Double, line: Int) {

        latitude = lat
        longitude = lon
        lines = line

    }   
}

Но я пытаюсь выяснить, как создать коллекцию этих объектов шины из JSON, которая (в полном объеме) содержит около 1000 объектов (количество меняется в течение дня).

Может ли кто-нибудь указать мне правильное направление? Мне не нужно полностью закодированное решение, просто несколько советов о том, как мне подходить к этому.

Скорее всего, я буду использовать SwiftyJSON CocoaPod для анализа JSON вместе с Alamofire для его получения.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

написать список моделей, подобных этой

class BusListModel {

var list = [Bus]()
var longitude : Double = 2.22
var lines : Int = 0

   init (With dict:[String:Any]) {
       if let result = dict["result"] as? [[String:Any]]{
           for busDetail in result{
            let model = Bus(lat: **valueHere**, lon: **valueHere**, line: **valueHere**)
             list.append(model)
            }

         }
   }   
}
0 голосов
/ 25 августа 2018

Спасибо всем за ответы, особенно @ dahiya_boy

Я настроил код, отправленный @dahiya_boy, и получил именно то, что мне нужно.

Нижекод.Я создал jsonString в качестве примера.

import Foundation

    class MyModelClass: Codable {
        let busArray: [Bus]

        enum CodingKeys: String, CodingKey {
            case busArray = "result"
        }

        init(busArray: [Bus]) {
            self.busArray = busArray
        }
    }

    class Bus: Codable {
        let lat, lon: Double
        let time, lines, brigade: String

        enum CodingKeys: String, CodingKey {
            case lat = "Lat"
            case lon = "Lon"
            case time = "Time"
            case lines = "Lines"
            case brigade = "Brigade"
        }

        init(lat: Double, lon: Double, time: String, lines: String, brigade: String) {
            self.lat = lat
            self.lon = lon
            self.time = time
            self.lines = lines
            self.brigade = brigade
        }
    }

    var jsonString = """

    {
    "result":[
    {
    "Lat":52.276408,
    "Lon":21.167618,
    "Time":"2018-08-24 11:50:05",
    "Lines":"225",
    "Brigade":"4"
    },
    {
    "Lat":52.222656,
    "Lon":21.102633,
    "Time":"2018-08-24 11:51:03",
    "Lines":"225",
    "Brigade":"2"
    },
    {
    "Lat":52.2100185,
    "Lon":21.2054211,
    "Time":"2018-08-24 11:51:08",
    "Lines":"119",
    "Brigade":"2"
    },
    {
    "Lat":52.1676735,
    "Lon":21.2222606,
    "Time":"2018-08-24 11:51:07",
    "Lines":"213",
    "Brigade":"3"
    }
    ]
    }

    """

    if let jsonData = jsonString.data(using: .utf8) {

        let decodedJSON = try! JSONDecoder().decode(MyModelClass.self, from: jsonData)

        print("Latitude: \(decodedJSON.busArray[0].lat), Longitude: \(decodedJSON.busArray[0].lon), Line: \(decodedJSON.busArray[0].lines)")

    }

Это печатает следующий вывод консоли:

Latitude: 52.276408, Longitude: 21.167618, Line: 225
0 голосов
/ 24 августа 2018

Вы можете использовать ниже Codable класс как Larme в комментариях.

import Foundation

class MyModelClass: Codable {
    let result: [Result]

    init(result: [Result]) {
        self.result = result
    }
}

class Result: Codable {
    let lat, lon: Double
    let time, lines, brigade: String

    enum CodingKeys: String, CodingKey {
        case lat = "Lat"
        case lon = "Lon"
        case time = "Time"
        case lines = "Lines"
        case brigade = "Brigade"
    }

    init(lat: Double, lon: Double, time: String, lines: String, brigade: String) {
        self.lat = lat
        self.lon = lon
        self.time = time
        self.lines = lines
        self.brigade = brigade
    }
}

Если вы хотите использовать ObjectMapper , тогда вы можете использовать ниже класса

import Foundation 
import ObjectMapper 

class MyModelClass: Mappable { 

    var result: [Result]? 

    required init?(map: Map){ 
    } 

    func mapping(map: Map) {
        result <- map["result"] 
    }
} 

class Result: Mappable { 

    var lat: NSNumber? 
    var lon: NSNumber? 
    var time: String? 
    var lines: String? 
    var brigade: String? 

    required init?(map: Map){ 
    } 

    func mapping(map: Map) {
        lat <- map["Lat"] 
        lon <- map["Lon"] 
        time <- map["Time"] 
        lines <- map["Lines"] 
        brigade <- map["Brigade"] 
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...