首页 > 解决方案 > 使用 swiftyJSON 等解析 JSON

问题描述

嗨,我尝试解析我的 JSON,但无法从中获取数据,(我使用 SwiftyJSON)如何解析这个丑陋的 JSON?

//标记:解析器函数:

 private func parseProvincesResult(provincesJSON: JSON, completion: @escaping(_ :ProvincesV2) -> Void) {
    
 
    print(provincesJSON)
    
    let errorCode: Int = provincesJSON["ErrorCode"].intValue
    let errorDescriptions: String = provincesJSON["ErrorString"].stringValue
    let newMacKey: String = provincesJSON["NewMacKey"].stringValue
    let newPinKey: String = provincesJSON["NewPinKey"].stringValue
    let version: Int = provincesJSON["Ver"].intValue
    var provinceList: [ProvinceListResult] = []
    
    for i in provincesJSON["ProvinceListResult"].arrayValue {
        
        let id: Int = i["Id"].intValue
        let name: String = i["Name"].stringValue
        
        let proList =  ProvinceListResult(id: id, name: name)
        provinceList.append(proList)

        }
        
        let model = ProvincesV2(errorCode: errorCode, errorDescriptions: errorDescriptions, newMacKey: newMacKey, newPinKey: newPinKey, version: version, provinceList: provinceList)
        completion(model)
    }

我的 JSON 是:

 {"ErrorCode":"8",
"ErrorString":"عملیات با موفقیت انجام شد.",
"NewMacKey":"vph+eLFgxa6LVq90QfsNUA==",
"NewPinKey":"evJiM9W6S9RWEClR6csxEQ==",
"Ver":201,
"ProvinceListResult":[{"Id":1,"Name":"آذربايجان شرقي"},
{"Id":2,"Name":"آذربايجان غربي"},
{"Id":3,"Name":"اردبيل"},
{"Id":4,"Name":"اصفهان"},
{"Id":5,"Name":"البرز"},
{"Id":6,"Name":"ايلام"},
{"Id":7,"Name":"بوشهر"},
{"Id":8,"Name":"تهران"},
{"Id":9,"Name":"چهارمحال و بختياري"},
{"Id":10,"Name":"خراسان جنوبي"},{"Id":11,"Name":"خراسان رضوي"},{"Id":12,"Name":"خراسان شمالي"},{"Id":13,"Name":"خوزستان"},{"Id":14,"Name":"زنجان"},{"Id":15,"Name":"سمنان"},{"Id":16,"Name":"سيستان و بلوچستان"},{"Id":17,"Name":"فارس"},{"Id":18,"Name":"قزوين"},{"Id":19,"Name":"قم"},{"Id":20,"Name":"کردستان"},{"Id":21,"Name":"کرمان"},{"Id":22,"Name":"کرمانشاه"},{"Id":23,"Name":"کهکيلويه و بويراحمد"},{"Id":24,"Name":"گلستان"},{"Id":25,"Name":"گيلان"},{"Id":26,"Name":"لرستان"},{"Id":27,"Name":"مازندران"},{"Id":28,"Name":"مرکزي"},{"Id":29,"Name":"هرمزگان"},{"Id":30,"Name":"همدان"},{"Id":31,"Name":"يزد"},{"Id":44,"Name":"کیش"}]}

我该如何解析它?tnx

标签: jsonswift

解决方案


使用 Codable,您可以这样做:

import Foundation

// MARK: - Welcome
struct Welcome: Codable {
    let errorCode, errorString, newMACKey, newPinKey: String
    let ver: Int
    let provinceListResult: [ProvinceListResult]

    enum CodingKeys: String, CodingKey {
        case errorCode = "ErrorCode"
        case errorString = "ErrorString"
        case newMACKey = "NewMacKey"
        case newPinKey = "NewPinKey"
        case ver = "Ver"
        case provinceListResult = "ProvinceListResult"
    }
}

// MARK: - ProvinceListResult
struct ProvinceListResult: Codable {
    let id: Int
    let name: String

    enum CodingKeys: String, CodingKey {
        case id = "Id"
        case name = "Name"
    }
}

(由https://app.quicktype.io生成)

得到一个值可能看起来像:

let welcome = try? JSONDecoder().decode(Welcome.self, from: jsonData)
            print(welcome?.provinceListResult[1])
print(welcome?.provinceListResult[1])

如果您的原始数据在String格式中,则可以Data通过执行以下操作将其转换为:

myStringJSON.data(using: .utf8)!

推荐阅读