如何在 swift 3 中解析 JSON
Posted
技术标签:
【中文标题】如何在 swift 3 中解析 JSON【英文标题】:How to parse the JSON in swift 3 【发布时间】:2016-11-20 13:32:23 【问题描述】:我正在尝试解析从服务器响应中读取的 JSON。我能够获取第一级,但之后我可以遍历到下一个级别。由于我对 ios 完全陌生,所以我尽可能多地探索和尝试,但一切都在脉络中。我怀疑缺少基本级别的东西。
let json = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary
打印(json)
"ab_report" = "[\"label\":\"ART\",\"value\":187,\"label\":\"SINDED\",\"value\":24,\"label\":\"RES\",\"value\":1,\"label\":\"REAL\",\"value\":1]";
distslist = (
"_id" =
"$id" = 5732d884dbe782a63c760e3b;
;
"dt_code" = ADB;
"dt_name" = Adilaasbad;
"st_name" = 572d95c0dsdfbe7823348c981b3;
,
"_id" =
"$id" = 572d95d4dbsadfe7826b48c981b3;
;
"dt_code" = HEEWYD;
"dt_name" = aassas;
"st_name" = 572d95c0efghbe7823348dc981b3;
)
"last_ssdate" = "Lase on : 2s0";
message = "";
"ressdfort" = "[\"label\":\"Ded\",\"value\":71,\"label\":\"Weed\",\"value\":0,\"label\":\"Scrnitiated\",\"value\":0]";
"scrort" = "[\"label\":\"Physicals\",\"value\":8551,\"label\":\"General\",\"value\":15752,\"label\":\"Ees\",\"value\":2756]";
打印(json[“ressdfort”]!)
["label":"Ded","value":71,"label":"Weed","value":0,"label":"Stiated","value":0]
在此之后,我想用“标签”和“值”从每个对象中一一获取值。
提前致谢。
【问题讨论】:
json["ressdfort"]! 返回一个Array
类型为 Dictionary
'[Dictionary]` 的元素。谷歌如何处理这些类型。如果用 Swift 做东西,你可能想要阅读:developer.apple.com/library/content/documentation/Swift/…
@shallowThought 感谢您的建议,我浏览了该链接并获得了一些基本想法。当我打印print(type(of:json))
时,它是__NSDictionaryI
,type(of:json["ressdfort"]!)
它是__NSCFString
和type(of:json["ressdfort"]!)
它是Optional<Any
。我试图通过let sng = json["ressdfort"] as! NSArray
获得数组,但我得到'无法转换__NSCFString' (0x10e819320) to 'NSArray' (0x10e819c58).
类型的值,你能建议我如何进一步处理。谢谢!
两个想法:在 Swift 中更喜欢Dictionary
([String:Any] 或类似的东西)而不是NSDictionary
。此外,您的 JSON 将 JSON 字符串作为 JSON 嵌入其中,因此对于 ressdfort
、script
和 ab_report
值,您必须再次调用 JSONSerialization
。
【参考方案1】:
现在试试这个来获取“标签”值。将你的 jsonObj 传递给这个函数。希望它对你有用:)
func parseJson(_ JsonDict: AnyObject)
if let dict = JsonDict["ressdfort"] as? [AnyObject]
for dict1 in dict
if let textDist = (dict1 as? [String : AnyObject])?["label"]
print("YOUR LABEL TEXT IS \(String(describing: textDist))")
【讨论】:
【参考方案2】:您可以使用 Alamofire 并按如下方式解析 json 响应:
Alamofire.request(.POST, YOUR_URL, parameters: DIC_PARAMETERS, encoding: .URLEncodedInURL)
.responseJSON response in
guard response.result.error == nil else
print(response.result.error!)
return
if let value = response.result.value
print("Your Response is: " + value.description)
if((response.result.value) != nil)
let swiftyJsonVar = response.result.value!
do
if let dicObj = swiftyJsonVar as? NSDictionary
print("Response is dictionary")
print(dicObj)
let arrObj = dicObj["ab_report"] as NSArray
let arrObj2 = dicObj["distslist"] as NSArray
// Then iterate your arrObj and do as per your requirment.
else if let arrObj = swiftyJsonVar as? NSArray
print("Response is an array")
print(arrObj)
else
print("response is not valid JSON data")
【讨论】:
【参考方案3】:let bundle = json["ressdfort"] as! Array
for eachObject in bundle
let label = (eachObject as! NSDictionary).valueForKey("label")! as! String
let value =(eachObject as! NSDictionary).valueForKey("value")! as! String
print(label)
print(value)
【讨论】:
很抱歉它没有工作,我收到Ambiguous reference to member 'subscript'
以上是关于如何在 swift 3 中解析 JSON的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 3 中使用 Alamofire 4 解析这个 json?
如何在 Swift 3 中解析来自 URL 的 JSON 数据
如何以正确的方式在 IOS SWIFT 3 中解析 Google 距离矩阵 API JSON