【发布时间】:2019-02-21 18:49:55
【问题描述】:
我目前一直在寻找许多类似的问题。然而,它们中的大多数使用旧版本的 swift 已经过时了。比如这些:
Swift: Testing optionals for nil
swift how can I check for NULL values coming from Json
Value type of "Any" has no member 'objectforKey' Swift 3 conversion
How to retrieve a value from JSON Object Swift 4
我发现了几个更相关的问题,但所解决的问题非常具体。
理论上操作看起来很简单。如果值为 null 则将其更改为空字符串 ""
这是我正在处理的数据示例:
{
"waybill" : "",
"city" : "",
"name" : "TESTING ",
"external_branch" : "",
"address" : "",
"name_from" : "",
"date" : "2018-09-14",
"province" : "",
"dept" : "A\/P",
"signature" : "",
"name_to" : "",
"trans_num" : 11,
"created_user" : "jsilvest",
"modified_datetime" : "0000-00-00 00:00:00",
"signature_timestamp" : "0000-00-00 00:00:00",
"mail_type" : "",
"comments" : null,
"received_name" : "TESTING",
"modified_user" : "",
"created_datetime" : "2018-09-14 14:03:18",
"country" : ""
}
注意 cmets 如何为 null 而不是空字符串 ""。
有更多相同格式的数据集具有相同的 cmets null 结果。
这导致我的应用程序崩溃,我正在尝试创建一个条件以将 null 值更改为“”。
以下是我的一些尝试:
let updateJson:String = jsonData[IndexPath][forKey:"customer"] as! String // ERROR cannot convert type of any object
if jsonData(forKey: "comments") == NSNull {
//ERROR Cannot call value of non function type 'json'
}
阅读后我开始认为使用 NSDictionary 不是正确的使用方法。
这是我用来在 API 中查询 JSON 数据的函数。
static func queryAPI(query: String, completionHandler: @escaping (NSDictionary?, Error?) -> ()) -> () {
let url = GlobalVar.API_URL + query
let currentToken = #############
let headers: HTTPHeaders = [
"Content-Type": "application/json",
"Source": "########",
"Authorization": "########" + currentToken
]
print("currentToken: \(currentToken)")
Alamofire.request(url, headers: headers).responseJSON { response in
switch response.result {
case .success(let value):
let jsonData = value as! NSDictionary
completionHandler(jsonData, nil)
case .failure(let error):
completionHandler(nil, error)
}
}
}
任何帮助都会很棒!
谢谢
编辑更新 ----- 已解决
因为我对 IOS 和快速开发非常陌生。 正如 Ashely Mills 的回答中提到的,我已经创建了一个错误使用 NSDictionary 的大熔炉。 当时我不知道这是一种不正确的方式并且容易出错。
当我使用下面的代码将 json 数据加载到我的表中时:
for (_, value) in jsonData["data"] {
self.mail.append(Mailing(transnum: value["trans_num"].int!, from: value["name_from"].string!, to: value["name_to"].string!, department: value["dept"].string!, trackingId: value["waybill"].string!, receivedDate: value["date"].string!, deliveryDate: value["date"].string!, comments: value["comments"].string!, signedFor: false, signature: value["signature"].string!, expanded: false))
}
我收到一个错误:展开时意外发现 null。 如上所述,这是由于 json 中的 cmets 产生的空值。
为了避免重组我使用 NSDictionary 错误构建的整个应用程序。
我尝试创建循环并检查以将空数据更改为空字符串。经过数小时的尝试但由于 NSDictionary 而没有成功,我能够通过一个简单的解决方案来解决问题:
从for内的行上方的代码
comments: value["comments"].string!
改为
comments: value["comments"].stringValue
摆脱我的错误并成功加载数据。
【问题讨论】: