如何在swift最新版本中从三个或更多级别获取json数据

时间:2016-12-29 20:03:30

标签: json swift

我正试图从这个json文件获得考勤价值" 321" ,日期" 654"和价值" 123"来自" Number" in" @ attributes"。我已设法过滤级别,但我想知道是否有更有效的方法来访问大于3的级别的值。或者在csharp中有类似linq的库。

我可以跳转到#34; GameData"并获取所有GameData并存储到对象列表。

或只是一个链条,例如:

json["level1"].["level2"].["level3"]
杰森:

{
    "Feed":{
        "Doc":{
             "Comp": {
             },
             "GameData": {                  
                 "GameInfo": {
                     "Attendance": 321,
                      "Date": 654,
                      "ID": 00
                 }
             },      
             "GameData": {                  
                 "GameInfo": {
                     "Attendance": 321,
                     "Date": 654
                     "ID": 01
                 }          
             }
        },
        "@attributes": {
            "Number": 123
        }
    }
}

代码:

let json = try JSONSerialization.jsonObject(with: data!,      options: .mutableContainers) as! [String: AnyObject]
if let articlesFromJson = json["Feed"] as? [String: AnyObject]{
    print("level1")
        if let aFromJson = articlesFromJson["Doc"] as? [String: AnyObject]{
            print("level2")
                if let aFromJson = articlesFromJson["GameData"] as? [String: AnyObject]{
                    print(aFromJson)

        }
    }
}

2 个答案:

答案 0 :(得分:1)

我真的很喜欢SwiftyJson让你这样做:

import SwiftyJSON
let json = JSON(data: data)
let game = json["Feed"]["Doc"]["GameData"] // this is of type JSON

let attendance = game["GameInfo"]["Attendance"].string ...

let number = json["Feed"]["@attributes"]["Number"].string // this is of type String?
let number = json["Feed"]["@attributes"]["Number"].stringValue // this is of type String, and will crash if the value is missing

===编辑:有关重复标签的信息===

JSON本身并没有阻止您这样做:https://stackoverflow.com/a/21833017/2054629但您会发现大多数图书馆都将JSON理解为字典和数组,而这些结构不能有重复的密钥。

例如,您可以在浏览器控制台中测试javascript:

JSON.stringify(JSON.parse('{"a": 1, "a": 2}')) === '{"a": 2}'

我相信SwiftyJson的行为类似。因此,我建议您将JSON结构更改为:

{
    "Feed":{
        "Doc":{
            "Comp": {},
            "GameData": {                  
                "GamesInfo": [
                    {
                        "Attendance": 321,
                        "Date": 654,
                        "ID": 0
                    },
                    {
                        "Attendance": 321,
                        "Date": 654
                        "ID": 1
                    }
                ]
            },
        },
        "@attributes": {
            "Number": 123
        }
    }
}

答案 1 :(得分:0)

循环遍历数组,直到您处于所需对象的循环中。然后根据需要投射该值。