如何在swift 3中实现多个值的模型类?

时间:2017-11-09 09:06:00

标签: ios swift

这里我在JSON中有value,其中对于一些多个键值对,它返回字符串,而对于某些键,它返回的数组位于第一个字典中的自定义属性数组中value键值对存在的数据是不同的,并且在第二个字典value中,键值对在这里是不同的,那么如何为不同键值的内部数组实现模型类?

struct MediaGallery {

    let id : Int
    let mediaType : String
    let label : Any
    let position : Int
    let disabled : Any
    let file : String

    init(dict : [String:Any]) {
        self.id = (dict["id"] as? Int)!
        self.mediaType = (dict["media_type"] as? String)!
        self.label =  dict["label"]!
        self.position = (dict["position"] as? Int)!
        self.disabled = dict["disabled"]!
        self.file = (dict["file"] as? String)!
    }
}
struct AttributeList {

    let label : String
    let value : String
    let code : String

    init(dict : [String:Any]){

        self.label = (dict["label"])! as! String
        self.value = (dict["value"])! as! String
        self.code = (dict["code"])! as! String
    }
}
struct DetailsListAttribute {

    let attributeCode : String
    let value : Any

    init?(dict : [String:Any]) {

        self.attributeCode = dict["attribute_code"] as! String
        print(self.attributeCode)
        if let values = dict["value"] as? String {
            self.value = values
        }
        else {
            if let arr = dict["value"] as? [[String:Any]]{
                var filterArr = [AttributeList]()
                for obj in arr {
                    filterArr.append(AttributeList(dict: obj))
                }
                self.value = filterArr
            } else {
                self.value = [AttributeList]()
            }
        }

    }
}

4 个答案:

答案 0 :(得分:0)

我尝试了Tj3n评论中提到的多个JSON映射框架。他们都有利有弊。 Apple建议您遵循here给出的建议。您还应该检查Codable协议(需要swift 4)。

答案 1 :(得分:0)

我建议您使用这个优秀的GIT图书馆ObjectMapper节省一些时间。它将帮助您建模对象并将模型对象(类和结构)转换为JSON,反之亦然。

答案 2 :(得分:0)

好的,我没有完整的JSON,而且我似乎也不清楚。

但是,您可以使用Codable协议轻松地在Swift中解析和创建模型类。

您可以阅读更多相关内容和/或一些示例,教程:Ultimate Guide

简而言之,什么是Codable协议?

您不再需要第三方库,以便将json数据解析并设置为模型类。 你应该像JSON一样创建你的类。根据键名称,它将为您创建类,属性和一切。

以下是您的JSON示例,我不知道我是否理解您的JSON格式,但您有诀窍:

struct Response: Codable {
    let ca: [CustomAttribute]?

    enum CodingKeys: String, CodingKey {
        case ca = "custom_attributes"
    }
}

struct CustomAttribute: Codable {
    let code: String?
    let value: [Value]?

    struct Value: Codable {
        let label: String?
        let value: String?
        let code: String?

        let avg: String?  // I don't know how your value array is composed
        let count: Int?   // I don't know how your value array is composed
    }

    enum CodingKeys: String, CodingKey {
        case code = "attribute_code"
        case avg = "avg_rating_percent"
    }
}

对我来说,它看起来就像那样。

我没有看到整个JSON,但想象你有整个JSON作为Response Struct,它包含几个对象,例如CustomAttribute Array。 然后,您可以定义CustomAttribute结构,并添加与JSON一样多的属性。

无论如何,你可以这样称呼它:

当您收到API通话的回复时,您可以:

if let data = response.data {
         let decoder = JSONDecoder()
         let response = try! decoder.decode(Response.self, from: data)
         print("Only printing the Custom Attribute : \(response.ca!)")
} 

我将整个json数据解码为Object Response(就像我的Struct)。 我转到我的回复回复,或

答案 3 :(得分:0)

这可能会迟到但我认为这会有所帮助

模型类因SwiftyJSON,简单swift类,Gloss或swift codable(Swift 4)等框架而异。您可以使用自定义jsoncafe.com

轻松在线生成模型类