首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从JSON创建对象集合

如何从JSON创建对象集合
EN

Stack Overflow用户
提问于 2018-08-24 10:41:54
回答 3查看 95关注 0票数 1

我正在学习Swift,我想制作一个应用程序来显示地图上公共汽车的GPS坐标。总线lat和lon来自一个JSON (以下摘录):

代码语言:javascript
复制
    {
   "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"
      }
    ]
}

我在考虑创建一个公共汽车课程

代码语言:javascript
复制
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创建这些总线对象的集合,JSON(完整的)包含大约1000个对象(数量在一天中变化)。

有人能给我指明正确的方向吗?我不需要完全编码的解决方案,只是一些关于我应该如何处理这个问题的提示。

我很可能会使用SwiftyJSON CocoaPod进行JSON解析,同时使用Alamofire来获得它。

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-24 10:48:22

您可以使用Codable类下面的Larme在评论中说。

代码语言:javascript
复制
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,那么您可以使用下面的类

代码语言:javascript
复制
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"] 
    }
} 
票数 0
EN

Stack Overflow用户

发布于 2018-08-24 10:49:10

这样的写列表模型

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-08-24 21:15:17

感谢大家的回答,特别是@dahiya_boy

我定制了@dahiya_boy发布的代码,最终得到了我所需要的。

下面是密码。例如,我创建了一个jsonString

代码语言:javascript
复制
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)")

    }

这将打印以下控制台输出:

代码语言:javascript
复制
Latitude: 52.276408, Longitude: 21.167618, Line: 225
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52002740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档