首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS 9 JSON解析循环

iOS 9 JSON解析循环
EN

Stack Overflow用户
提问于 2015-10-08 18:10:10
回答 2查看 625关注 0票数 0

我正在创建一个应用程序,它应该从数据库中检索一些JSON。

这就是我的JSON的样子:

代码语言:javascript
复制
[{"id":"1","longitude":"10","latitude":"10","visibility":"5","timestampAdded":"2015-10-01 15:01:39"},{"id":"2","longitude":"15","latitude":"15","visibility":"5","timestampAdded":"2015-10-01 15:06:25"}]

这是我使用的代码:

代码语言:javascript
复制
if let jsonResult = JSON as? Array<Dictionary<String,String>> {

                    let longitudeValue = jsonResult[0]["longitude"]
                    let latitudeValue = jsonResult[0]["latitude"]
                    let visibilityValue = jsonResult[0]["visibility"]

                    print(longitudeValue!)
                    print(latitudeValue!)
                    print(visibilityValue!)
}

如您所见,它只从JSON获得第一个块,如果根本没有JSON,它就会崩溃,但是如果我想让它计数数量,然后像这样从它中生成一个数组:

代码语言:javascript
复制
var longitudeArray = [10, 15]
var latitudeArray = [10, 15]

等等..。

我也需要这个苹果手表兼容,所以我不能使用SwiftyJSON。

我做什么好?我真的希望你能帮我!

谢谢。

解决了!

问题被"Eric D.“解决了。

这是代码:

代码语言:javascript
复制
do {
    if let url = NSURL(string: "YOU URL HERE"),
        let data = NSData(contentsOfURL: url),
        let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? [[String:AnyObject]] {

        print(jsonResult)
        let longitudeArray = jsonResult.flatMap { $0["longitude"] as? String }
        let latitudeArray = jsonResult.flatMap { $0["latitude"] as? String }
        print(longitudeArray)
        print(latitudeArray)

    }
} catch let error as NSError {
    print(error.description)
}

谢谢你,埃里克!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-08 19:56:50

您可以使用flatMap获取元素的数组:

代码语言:javascript
复制
let longitudeArray = jsonResult.flatMap { $0["longitude"] as? String }
let latitudeArray = jsonResult.flatMap { $0["latitude"] as? String }

等。

flatMap类似于map,但需要打开选项,这就足够了,因为我们需要安全地转换json数组中从每个字典中获得的对象的类型。

$0表示应用到的数组的当前flatMap迭代中的对象。

如果您目前使用的是SwiftyJSON,那么应该是:

代码语言:javascript
复制
let longitudeArray = jsonResult.flatMap { $1["longitude"].string }
let latitudeArray = jsonResult.flatMap { $1["latitude"].string }

因为.string是SwiftyJSON的可选字符串值getter。

但是正如您所说的,您不想再使用它了,所以您需要使用NSJSONSerialization来解码您的JSON数据,网络上有很多例子。那你就可以用我原来的答案了。

票数 1
EN

Stack Overflow用户

发布于 2015-10-08 18:55:09

您已经得到了一个包含所有元素的数组(不仅仅是第一个元素)。你只需要访问第一个)。jsonResult是一组字典。每个字典(在本例中,基于您提供的json )包含以下元素: id、经度、纬度、可见性和timestampAdded。为了访问每个元素,您可以简单地在jsonResult上循环并访问I‘’th元素(而不是总是0元素)。这还将防止您在json中遇到的崩溃是空的或无效的(因为您将只查看jsonResult中的有效元素。

这将为您提供创建希望创建的自定义数组的灵活性(例如,为了创建一个所有经度的数组,您只需在遍历jsonResult时将该元素添加到新数组中即可)。但是,如果您想省去手工构建这些数组的麻烦,并且假设您可以控制json结构,那么我建议将接收到的json更改为相关的结构(字典或数组而不是字典数组),这样它将更适合您的需要,并以“开箱即用”的相关格式提供结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33023035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档