【发布时间】:2015-06-15 16:10:11
【问题描述】:
我想请求一些帮助。
我有一个调用 web 服务并从中获取 json 对象的方法。
看起来像这样:
func wsServiceFeedTst() {
println("WS called...")
println("tstFrames count: " + tstFrames.count.description)
let json = JSON(url:"http://79.172.249.175:7001/RestWebServiceApp/webresources/entity.bkkkallerfeedtst")
println(json)
for (k, v) in json["bkkKallerFeedTst"] {
let dateShow : NSDate? = v["feedDate"].asDate
var finalFormatter = NSDateFormatter()
finalFormatter.dateFormat = "yyyy.MM.dd - HH:mm"
let finalDate = finalFormatter.stringFromDate(dateShow!)
tstFrames.append(TimeFrame(text: v["feedText"].description, date: finalDate, image: nil, routeName: v["feedRouteShName"].description, postId: v["id"].description,routType: v["feedImgType"].description))
}
}
在我得到 json 之后,我试图对其进行迭代并尝试将 json 的节点添加到另一个数组但是当我的 json 只包含一个元素时它失败了,因为我的 json 不是数组,这是行哪里抛出异常:
let finalDate = finalFormatter.stringFromDate(dateShow!)
它正在等待可选,但由于此行导致它为零:
let dateShow : NSDate? = v["feedDate"].asDate
这就是我的 json 只有一个元素时的样子:
{"bkkKallerFeedTst":{"feedRouteShName":"143","id":"348","feedLat":"47.5998971180592","feedImgType":"3","feedDate":"2015-06-15T14:07:30+02:00","feedLon":"19.0457082953807","feedText":"Itthon :)”}}
这就是当它有多个元素时的样子(现在它有两个元素)
{"bkkKallerFeedTst":[{"feedRouteShName":"H5","id":"349","feedLat":"47.5535475845461","feedImgType":"2","feedDate":"2015-06-15T15:27:02+02:00","feedLon":"19.0458004338391","feedText":"Hév ;)"},{"feedRouteShName":"143","id":"348","feedLat":"47.5998971180592","feedImgType":"3","feedDate":"2015-06-15T14:07:30+02:00","feedLon":"19.0457082953807","feedText":"Itthon :)"}]}
有人知道如何解决这个问题吗?
非常感谢!
通过答案我创建了这个:
var bkkKallerFeedTst = json["bkkKallerFeedTst"]
var bkkKallerFeedTstArray : [[NSObject : AnyObject]]
bkkKallerFeedTstArray = []
if bkkKallerFeedTst.isDictionary {
bkkKallerFeedTstArray.append(bkkKallerFeedTst.asDictionary!)
} else {
}
for feed in bkkKallerFeedTstArray {
println(feed["feedRouteShName"]) //now its printing: Optional(143)
}
现在它正在打印:
[feedImgType: 3, feedRouteShName: 143, feedLat: 47.5998971180592, feedText: Itthon :), feedLon: 19.0457082953807, id: 348, feedDate: 2015-06-15T14:07:30+02:00]
更新:这是解决方案..
var bkkKallerFeedTst = json["bkkKallerFeedTst"]
var bkkKallerFeedTstArray : [JSON]
if bkkKallerFeedTst.isDictionary {
bkkKallerFeedTstArray = [bkkKallerFeedTst] //initialize
} else {
bkkKallerFeedTstArray = bkkKallerFeedTst.asArray!
}
for bkk in bkkKallerFeedTstArray {
let dateShow : NSDate = bkk["feedDate"].asDate!
var finalFormatter = NSDateFormatter()
finalFormatter.dateFormat = "yyyy.MM.dd - HH:mm"
let finalDate = finalFormatter.stringFromDate(dateShow)
tstFrames.append(TimeFrame(text: bkk["feedText"].description, date: finalDate, image: nil, routeName: bkk["feedRouteShName"].description, postId: bkk["id"].description,routType: bkk["feedImgType"].description))
}
【问题讨论】:
-
你能用一行陈述你的问题吗?
-
我的问题是如果我的 json 对象只有一个节点,如何迭代它..
-
key:value 对的数量与迭代无关。所以不管是1还是10都无所谓,都是一样的逻辑
-
您使用的是哪个 JSON API? (或者 JSON 类的子类是什么?)
-
顺便说一句,你声明
dateShow :NSDate是可选的,你能验证它是一个有效的对象吗?你正在解开它,但它说它为零。这是一个很大的提示