如何在 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)) 时,它是__NSDictionaryItype(of:json["ressdfort"]!) 它是__NSCFStringtype(of:json["ressdfort"]!) 它是Optional<Any。我试图通过let sng = json["ressdfort"] as! NSArray 获得数组,但我得到'无法转换__NSCFString' (0x10e819320) to 'NSArray' (0x10e819c58). 类型的值,你能建议我如何进一步处理。谢谢! 两个想法:在 Swift 中更喜欢Dictionary([String:Any] 或类似的东西)而不是NSDictionary。此外,您的 JSON 将 JSON 字符串作为 JSON 嵌入其中,因此对于 ressdfortscript 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中解析Json对象

如何在 Swift 3 中使用 Alamofire 4 解析这个 json?

如何在 Swift 3 中解析来自 URL 的 JSON 数据

如何以正确的方式在 IOS SWIFT 3 中解析 Google 距离矩阵 API JSON

如何从 swift 3 facebook 图形请求中解析这个 JSON

如何解析这个 JSON 口袋妖怪字典?口袋妖怪 API (swift 3)