swifty json 解析数组对象

Posted

技术标签:

【中文标题】swifty json 解析数组对象【英文标题】:swifty json parse array object 【发布时间】:2020-07-30 07:03:08 【问题描述】:

如何将Images 的数组设置为Car 类的images 变量

我的 json:


    "Description": "test comment",
    "GalleryId": 5548,
    "ShortCode": "rzswig",
    "Images": [
        
            "Id": 9742,
            "Link": "https://url/Images/5548/image9742_x560.jpg"
        ,
        
            "Id": 9749,
            "Link": "https://url/Images/5548/image9749_x560.jpg"
        ,
        
            "Id": 9746,
            "Link": "https://url/Images/5548/image9746_x560.jpg"
        
    ]

我的班级:

class Car: Hashable 
    var shortCode: String
    var description: String
    var galleryId: Int
    var imageItems: [ImageItem]?

    init(response: JSON) 
        shortCode = response["ShortCode"].stringValue        
        description = response["Description"].stringValue
        galleryId = response["GalleryId"].intValue
        imageItems = response["Images"].arrayObject.map $0 as? [ImageItem]
    
    
    init(shortCode: String, description: String, galleryId: Int, imageItems: [ImageItem]?) 
        self.description = description
        self.shortCode = shortCode
        self.galleryId = galleryId
        self.imageItems = imageItems
    


struct ImageItem 
    var id: Int
    var link: String

变体:

    imageItems = response["Images"].arrayObject.map $0 as? [ImageItem]

不适合我

【问题讨论】:

改用Codable 【参考方案1】:

如果你想继续使用 SwiftyJSON,你可以向 ImageItem 添加一个初始化器,它需要一个 JSON,就像你对 Car 所做的那样:

init(response: JSON) 
    id = response["Id"].intValue
    link = response["Link"].stringValue

如果需要,您可能还想添加自动生成的成员明智初始化程序。

然后,要初始化imageItems,请执行以下操作:

imageItems = response["Images"].array?.map(ImageItem.init(response:))

如果您使用 Swift 内置的 Codable API,整个事情会容易得多。

只需将CarImageItem 都符合Codable

class Car: Codable 
    var shortCode: String
    var description: String
    var galleryId: Int
    var imageItems: [ImageItem]?
    
    enum CodingKeys: String, CodingKey 
        case shortCode = "ShortCode"
        case description = "Description"
        case galleryId = "GalleryId"
        case imageItems = "Images"
    


struct ImageItem: Codable 
    var id: Int
    var link: String
    
    enum CodingKeys: String, CodingKey 
        case id = "Id"
        case link = "Link"
    

然后执行此操作以反序列化 json:

let car = JSONDecoder().decode(Car.self, data: jsonData) // jsonData is of type "Data"

【讨论】:

【参考方案2】:

我认为问题在于您将其映射为图像项数组

imageItems = response["Images"].arrayObject.map $0 as? ImageItem

【讨论】:

【参考方案3】:

尝试响应["images"].arrayValue

【讨论】:

以上是关于swifty json 解析数组对象的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Swifty 动态创建具有多个键和值的 json 对象

使用 Swifty JSON 解析数组

Swifty JSON 响应解析

如何使用 Swifty JSON 连接两个 json 对象

Swifty-JSON:无法解析下划线

使用 Swifty JSON 解析