解析JSON字符串到模型对象类型数组



我从API中获得了加密数据,该数据

URLSession.shared.dataTask(with: url!) 

将数据转换为JSON,但仍然是加密的

var json = try(JSONSerialization.jsonObject(with: data!, options: .allowFragments))

将其转换为字符串

let arr:String = json as! String 

解密它

let jsonText = arr.fromBase64()//extension method, given end of question

现在,它在JSON构造中如下(这只是1个记录,JSON String中有1个以上的记录)

{
  "CompanyAlt_Key": 1,
  "Company_Name": "XYZ LTD",
  "TableName": "CompanyList"
},

我有相同类型的模型

public class CompanyList {
    public var companyAlt_Key : Int?
    public var company_Name : String?
    public var tableName : String?
}

这是Frombase64方法

func fromBase64() -> String {
    let data = NSData.init(base64Encoded: self, options: []) ?? NSData()
    return String(data: data as Data, encoding: String.Encoding.utf8) ?? ""
}

我面临的问题将JSON字符串进入类型CompanyList类

帮助您会很感激

您需要首先将jsonString转换为数据:

let jsonData = jsonString.data(using: .utf8)!

将数据转换为数组

let array = JSONSerialization.jsonObject(with: jsonData, options: nil) as? [[String: Any]]

然后迭代阵列…

let companies = array?.map {
    return CompanyList(dictionary: $0)
}

为您的CompanyList实现init方法,在您的响应中以每个记录的字典传递……

public class CompanyList {
    public var companyAlt_Key : Int?
    public var company_Name : String?
    public var tableName : String?
    init(dictionary: [String: Any]) {        
        companyAlt_Key = dictionary["companyAlt_Key"] as? Int
        company_Name = dictionary["company_Name"] as? String
        tableName = dictionary["tableName"] as? String
    }
}

您也可以使用它来验证数据。如果您的班级中的字段是非访问的,则可以使用可选的init如下…

public class CompanyList {
    public var companyAlt_Key : Int
    public var company_Name : String
    public var tableName : String
    init?(dictionary: [String: Any]) {        
        guard let companyAlt_Key = dictionary["companyAlt_Key"] as? Int,
        let company_Name = dictionary["company_Name"] as? String,
        let tableName = dictionary["tableName"] as? String else {
            return nil 
        }
        self.companyAlt_Key = companyAlt_Key
        self.company_Name = company_Name
        self.tableName = tableName
    }
}

如果您使用的是可选的初始化,请使用flatMap来确保您的数组中没有任何可选元素…

let companies = array?.flatMap {
    return CompanyList(dictionary: $0)
}

最新更新