如何解析复杂的JSON数据结构与斯威夫特3
问题描述:
我想解析这个JSON数据结构返回从一个URLSession包含项目的资源信息。尽管许多方法没有达到我需要访问数据的级别。如何解析复杂的JSON数据结构与斯威夫特3
具体而言,我需要获取作为r的计划员角色的作业状态以及J:后面的s:的状态。
因此,我认为我需要遍历所有值来查找规划师角色的状态,或者有没有一种方法来指定我正在寻找规划师并直接能够检索其状态?
我不知道如何遍历它来达到这个水平,这个问题的有趣但有挑战性的部分之一是有三个值的资源,所以我不认为字典键值对是正确的模式。
{
"Project": 43,
"definition": [
{
"statusCode": 0,
"entryID": "123",
"Initiatives": [],
"validationCode": "1.0.0"
},
{
"statusCode": 0,
"workProduct": [
{
"task": [
{
"desc": "define project scope",
"hours": 120,
"week": "1",
"resources": [
{
"r": "planner",
"l": "junior",
"s": "open"
},
{
"r": "architect",
"s": "senior",
"s": "filled"
}
],
"managerCode": "1285",
"teamCode": [
"413"
]
}
],
"scope": "project design"
}
],
"entryID": "123",
"validationCode": "1.0.0"
}
]
}
我试过多种解决方案试图访问它,基于各种SO答案,这article:
我可以打印JSON对象为一个字符串:
let stringData = String(data: projectInformation!, encoding: String.Encoding.utf8)
print(stringData as Any) //JSONSerialization
,但我不确定这是否是检索其值的最佳方式。
绝对感谢您的建议。
答
只是开始,但应该让你滚动。我分析它,直到workProduct
:
let object = try! JSONSerialization.jsonObject(with: data, options: []) as! [String: AnyObject]
let dictionaryItem = object["definition"]![1] as! [String: AnyObject]
let workProductItems = dictionaryItem["workProduct"]
这就产生了这样的事情:
{
scope = "project design";
task = (
{
desc = "define project scope";
hours = 120;
managerCode = 1285;
resources = (
{
l = junior;
r = planner;
s = open;
},
{
r = architect;
s = senior;
}
);
teamCode = (
413
);
week = 1;
}
);
}
)
, "validationCode": 1.0.0]
只是继续解析,直到你得到你想要的东西。
答
这将是混乱。
do{
let json = try JSONSerialization.jsonObject(with: data) as? [String: Any]
if let project = json["Project"] as? Int {
//do something
}
if let definition = json["definition"] as? [DefinitionType] {
// do something
}
} catch {
//error
}
或
做一个初始化init(json: [String: Any])
或
使用其他第三方库
感谢 - 所以我不断加入字典,我看到了[和我看到一个{?这是否是巧合,资源内部的数据不再与我的代码中的集合相匹配?例如,请注意,高级职员现在与架构师并且有代码s而不是l?我认为这是使用字典时的问题-whcih不能保证顺序,但最内层的关键值对失去了完整性。你明白我的意思吗?谢谢 – Jazzmine
[]是一个数组,{}是一个字典。你说得对,字典是无序的。我建议你阅读更多关于NSJsonSerialization的内容,并找到更多关于如何使用它的例子。 – RaffAl