当前位置: 首页 > 知识库问答 >
问题:

Swift4,在解析JSON后将空数据更改为“”(空字符串)

太叔昊苍
2023-03-14

我目前正在寻找许多类似的问题。然而,使用旧版本的swift,它们中的大多数已经过时。例如:

Swift:测试零的选项

Swift如何检查来自Json的NULL值

“Any”的值类型没有成员“objectforKey”Swift 3转换

如何从JSON对象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" : ""
}

请注意注释是空的,而不是空字符串“”。

还有更多相同格式的数据集,其注释结果相同为空。

这导致我的应用程序崩溃,我正在尝试创建一个条件将空值更改为“”。

以下是我的一些尝试:

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和快速发展非常陌生。正如阿什利·米尔斯在回答中提到的那样,我创造了一个错误使用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中的注释产生的空值。

为了避免重组我使用NSDicpedia错误构建的整个应用程序

我试图创建循环和检查以将空数据更改为空字符串。经过几个小时的尝试,由于NSDicpedia没有成功,我能够通过一个简单的解决方案解决问题:

for

comments: value["comments"].string!

改为

comments: value["comments"].stringValue

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

共有1个答案

徐承载
2023-03-14

好的,首先不要在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
 类似资料:
  • 我正在尝试从Firebase数据库中获取当前用户的UID——原则上这是一个简单的任务。我正在遵循从Firebase留档管理用户的指南,但我仍然无法找到解决方案。我到处都看到firebase.auth()。在初始化期间不会定义当前用户——好极了。我使用侦听器代替,侦听器会按应有的方式触发。但是由于某种原因,当它触发时,user的值为空。 不知道我在这里做错了什么。我得到 打印到控制台。

  • 我一直在此对象上收到JSON解析错误 “DC008”:“PD가격 $2.90/码에서 시작#10#10티앤티 난단에 나염작업#10#10나염비 \4000/YD(数字전사)#1010%损失#10#10판매가 수정 $7.30/码- 但我不知道哪个角色藏在这个物体里。 谁能帮帮我吗 字符串中的btw#10是从\n转换而来的

  • 问题内容: 我想将表列更改为可为空。我用过了: 这会导致出现错误。正确的语法是什么? 问题答案: 假设(基于您之前的问题): 用您的实际数据类型替换。

  • 回调类APIInterface 得到回应

  • 问题内容: 我有一个将存储Number对象的列表。该列表将通过分析字符串列表来填充,其中每个字符串都可以表示Number的任何子类。 如何将字符串解析为通用数字,而不是特定的整数或浮点数? 问题答案: 数字不能实例化,因为它是抽象类。我建议传入数字,但是如果您设置为字符串,则可以使用任何子类来解析它们, 要么 @请参阅NumberFormat

  • 类: JSON数据: {“列表”:[{“类型”:0,“文本”:“文本1”},{“类型”:1,“问题”:“文本2”}]} 类来保存列表项: 一切顺利,我为JSON字符串中的type和text获得了正确的值。但逮捕仍为空。