我正在解析一些JSON,这是我第一次在Swift上这样做。最近,我一直在避免使用强迫性向下倾斜,因为这是一种不好的做法。
不幸的是,这样做的缺点是我的代码变得更加混乱,尤其是在尝试解析JSON的特殊情况下。
这是我的代码:
if let dic = try NSJSONSerialization.JSONObjectWithData(currentData!, options: NSJSONReadingOptions.AllowFragments) as? [String: AnyObject] {
student["roll"] = dic["roll"] as? Int
student["firstName"] = dic["name"]?.componentsSeparatedByString(" ").first
student["lastName"] = dic["name"]?.componentsSeparatedByString(" ").last
var subjects = [[String: AnyObject?]]()
if let dicSubs = dic["subs"] as? [AnyObject] {
for dicSub in dicSubs {
var sub = [String: AnyObject?]()
sub["name"] = dicSub["name"] as? String
if let code = dicSub["code"] as? String {
sub["code"] = Int(code)
}
if let theory = dicSub["theory"] as? String {
sub["theory"] = Int(theory)
}
if let prac = dicSub["prac"] as? String {
sub["prac"] = Int(prac)
}
subjects.append(sub)
}
}
student["subjects"] = subjects
}
产生的输出以这种方式充斥着Optionals,几乎无法使用。我有一种感觉我做错了,因为这段代码的Objective C版本更清晰,更短。
有什么方法可以让它变得更好吗?
如果需要,这是产生的输出:
[
roll:Optional(1234567),
firstName:Optional("FIRSTNAME"),
lastName:Optional("LASTNAME"),
subjects:Optional( [
[
"code":Optional(123),
"theory":Optional(73),
"name":Optional(REDACTED)
],
[
"code":Optional(123),
"theory":Optional(76),
"name":Optional(REDACTED)
],
[
"code":Optional(123),
"theory":Optional(48),
"name":Optional(REDACTED)
],
[
"code":Optional(123),
"theory":Optional(75),
"prac":Optional(19),
"name":Optional(REDACTED)
],
[
"code":Optional(123),
"theory":Optional(69),
"prac":Optional(18),
"name":Optional(REDACTED)
],
[
"code":Optional(123),
"theory":Optional(63),
"prac":Optional(28),
"name":Optional(REDACTED)
]
] )
])
答案 0 :(得分:1)
展开选项(你已经为其中一些人做了,为所有人做了):
if let roll = dic["roll"] as? Int {
student["roll"] = roll
}
此外,初始化程序Int(...)
返回一个Optional,因此您必须使用Optional绑定解包它:
if let code = dicSub["code"] as? String, let myInt = Int(code) {
sub["code"] = myInt
}
答案 1 :(得分:1)
根据您需要的速度,我建议您使用某些第三方库进行JSON通信。一个很好的例子是:
您可以在这里查看有关它的教程:
http://www.raywenderlich.com/82706/working-with-json-in-swift-tutorial