我的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
请在上面的代码中帮助我,我无法解决此问题,很长一段时间以来我都陷入困境。
如果您查看bcustomerparms
属性,那是一本字典。
在下一行中
let customrParams = billerdetail["bcustomerparms"] as! String
您正试图将Dictionary
强制下调为String
,所以它肯定会崩溃。
正确的代码应该是
let customrParams = billerdetail["bcustomerparms"] as! [String: Any]
这里我也使用强制向下转换,但是您实际上应该使用if let
或guard let
。
以及其他评论的建议,您应该使用Codable
协议,因为它已成为反序列化JSON数据或decoding的一种方法。您可以在上面找到很多教程。