【问题标题】:Swift4, Change Null Data to "" (empty string) after parsing JSONSwift4,解析JSON后将空数据更改为“”(空字符串)
【发布时间】: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

摆脱我的错误并成功加载数据。

【问题讨论】:

    标签: ios json swift4


    【解决方案1】:

    好的,首先不要在 Swift 中使用NSDictionary(或NSArray),你会丢弃类型信息。

    所以你应该说……

    let jsonData = value as! [String: Any]
    completionHandler(jsonData, nil)
    

    然后检查字典中的值……

    let comments = jsonData["comments"]
    

    然后

    NSNull 是类,所以你要么需要测试......

    if comments is NSNull
    

    if comments == NSNull() // instance of NSNull
    

    【讨论】:

    • 您能否详细说明您的答案?添加您的建议后,我得到:Cannot call value of non-function type 'JSON'
    • 除了查找NSNull 值之外,您还有更多问题——听起来您不知道您的对象类型是什么或如何从字典中获取值。我已经更新了我的答案。
    • 我应该使用什么来代替 NSDictionary 或 NSArray?抱歉,对于 swift 和 IOS 来说还是新手。是的,有很多问题!感谢您提供一些帮助,我会努力解决的
    • 使用 Swift DictionaryArray。这些是关键类型,没有它们你不会走得太远。请查找并阅读相关的 Apple 文档。
    • 我能够解决我的问题。检查了它。感谢您抽出宝贵时间提供帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    相关资源
    最近更新 更多