我正试图从这个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)
}
}
}
答案 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)
循环遍历数组,直到您处于所需对象的循环中。然后根据需要投射该值。