如何从GET URL快速创建结构和初始化值

问题描述 投票:-2回答:1

我的JSON:

   {
  "id": "70",
  "bname": "Municipal Corporation - Water",
  "bcategoryname": "Water",
  "bcustomerparms": "[{\"paramName\":\"Consumer Number\",\"dataType\":\"NUMERIC\",\"optional\":\"false\",\"minLength\":\"1\",\"maxLength\":\"10\" .      },
           {\"paramName\":\"Mobile Number\",\"dataType\":\"NUMERIC\",\"optional\":\"false\",\"minLength\":\"10\",\"maxLength\":\"10\"},
           {\"paramName\":\"Email . Id\",\"dataType\":\"ALPHANUMERIC\",\"optional\":\"false\",\"minLength\":\"5\",\"maxLength\":\"100\"}]",
 }

 "id": "68",
 "bname": "Municipal Corporation - 12",
 "bcategoryname": "Water",
 "bcustomerparms": "[{\"paramName\":\"K No\",\"dataType\":\"ALPHANUMERIC\",\"optional\":\"false\",\"minLength\":\"7\",\"maxLength\":\"20\"}]",
 } 

我无法从get api创建结构,我需要根据其bcategoryname使用bname及其paramNamew,我需要在表中显示bname,如果我选择我需要其所有paramNames。

这里是代码:

struct JsonDataBiller{
var bname: String?
var bcategoryname: String?
var bcustomerparms: [cDetails]

init(bname: String, bcategoryname: String, bcustomerparms: [cDetails]){

    self.bname = bname
    self.bcategoryname = bcategoryname
    self.bcustomerparms = bcustomerparms
}
}

struct cDetails{
var paramName: String?
var minLength: String?
var maxLength: String?

init(paramName: String, minLength: String, maxLength: String)
{
    self.paramName = paramName
    self.minLength = minLength
    self.maxLength = maxLength
}
}

代码:

class AllMakePaymentViewController: UIViewController {

@IBOutlet weak var tableView: UITableView!

var jsonData = [JsonDataBiller]()

var minLength: String?
var maxLength: String?
var bName: String?
var category: Category?
var categoryName: String?
var paramName: String?

var ParamArray = [String]()

var labelText: String?
override func viewDidLoad() {
    super.viewDidLoad()

    allPaymentService()
}

func allPaymentService(){

    let urlStr = "https://dev.anyemi.com/webservices/anyemi/api.php?rquest=billermdm"
    let url = URL(string: urlStr)
    URLSession.shared.dataTask(with: url!, completionHandler: {(data, response, error) in
        guard let respData = data else {
            return
        }
        guard error == nil else {
            print("error")
            return
        }
        do{
            let jsonObj = try JSONSerialization.jsonObject(with: respData, options: .allowFragments) as! [String: Any]
            //print("the all make payment json is \(jsonObj)")
            let billerdetailsArray = jsonObj["billerdetails"] as! [[String: Any]]

            for billerdetail in billerdetailsArray {

                self.categoryName = billerdetail["bcategoryname"] as? String

                let customrParams = billerdetail["bcustomerparms"] as! String
                let res = try JSONSerialization.jsonObject(with:Data(customrParams.utf8)) as! [[String: Any]]

                for item in res {

                    self.paramName = item["paramName"] as? String

                    self.minLength = item["minLength"] as? String
                    self.maxLength = item["maxLength"] as? String
                                            if self.categoryName == "Water"{
                        let bName = billerdetail["bname"] as? String
                        self.jsonData.append(JsonDataBiller(bname: bName ?? "", bcategoryname: self.categoryName ?? "", bcustomerparms: [paramName: paramName, minLength: minLength, maxLength: maxLength]))

                    }
                    if self.categoryName == "Electricity"{
                        let bName = billerdetail["bname"] as? String
                        self.jsonData.append(JsonDataBiller(bname: bName ?? "", bcategoryname: self.categoryName ?? "", bcustomerparms: [paramName: paramName, minLength: minLength, maxLength: maxLength]))
                    }
                }
            }
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        }catch {
            print("catch error")
        } }).resume()
}
}

错误:

上下文类型'[cDetails]'不能与字典文字一起使用

这里我需要根据其bnam添加bcategoryname,并根据paramName添加bname

请在上面的代码中帮助我,我无法解决此问题,很长一段时间以来我都陷入困境。

ios json swift dictionary get
1个回答
0
投票

如果您查看bcustomerparms属性,那是一本字典。

在下一行中

let customrParams = billerdetail["bcustomerparms"] as! String

您正试图将Dictionary强制下调为String,所以它肯定会崩溃。

正确的代码应该是

let customrParams = billerdetail["bcustomerparms"] as! [String: Any]

这里我也使用强制向下转换,但是您实际上应该使用if letguard let

以及其他评论的建议,您应该使用Codable协议,因为它已成为反序列化JSON数据或decoding的一种方法。您可以在上面找到很多教程。

© www.soinside.com 2019 - 2024. All rights reserved.