【发布时间】:2020-03-15 20:52:17
【问题描述】:
我的 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,我需要在 table 中显示 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]' 不能与字典文字一起使用
这里我需要根据其bcategoryname添加bnam和根据bname添加paramName
请在上面的代码中帮助我,我无法解决这个问题,我卡住了很长时间。
【问题讨论】:
-
你应该使用 Codable... 如果你使用它,事情会简单得多
-
@SchaheerSaleem,请发布如何编码的答案
-
谷歌如何使用 Codable 协议解析 JSON。这是很棒的教程raywenderlich.com/3418439-encoding-and-decoding-in-swift
-
@swift json 格式不正确
-
错误发生在哪里?
标签: ios json swift dictionary get