社区首页 >问答首页 >数组解析中的JSON数组,SWIFTYJson

数组解析中的JSON数组,SWIFTYJson
EN

Stack Overflow用户
提问于 2018-06-14 21:12:24
回答 3查看 635关注 0票数 3

我一直在学习SWIFT应用程序中的JSON解析。到目前为止,我一直在使用一个简单的免费API,没有任何问题,应用程序按设计工作。但是现在我正在调用一个API,它在数组中返回一个数组。我已经按照指示读取并准备了变量来访问元素,但是SWIFT仍然看不到返回的JSON中的任何数据。我在这方面已经挣扎了2天,改变了我在网上所能找到的所有想法,但是我的默认变量仍然没有被来自JSON的数据覆盖。使用豆荚SWIFTYJson。

JSON部分摘录:

代码语言:javascript
代码运行次数:0
复制
    {
  "list" : [
    {
      "main" : {
        "grnd_level" : 984.67999999999995,
        "temp_min" : 283.30000000000001,
        "temp_max" : 284.54599999999999,
        "temp" : 283.30000000000001,
        "sea_level" : 1022.5,
        "pressure" : 984.67999999999995,
        "humidity" : 88,
        "temp_kf" : -1.25
      },
      "clouds" : {
        "all" : 0
      },
      "weather" : [
        {
          "main" : "Clear",
          "icon" : "01n",
          "description" : "clear sky",
          "id" : 800
        }
      ],

处理它的代码:

代码语言:javascript
代码运行次数:0
复制
func getWeatherData(url: String, parameters: [String : String]){
    //make http request and handle the JSON response
    print("\(url)\(parameters)")
    Alamofire.request(url, method: .get, parameters: parameters).responseJSON {
        response in //in means you are inside a closure (function inside a function)
        if response.result.isSuccess {
            print("Successfully got the weather data!")

            let weatherJSON : JSON = JSON(response.result.value!) //saving the JSON response to a constant weathrJSON  . We are using ! to self unwrap the value.
            self.updateWeatherData(json: weatherJSON) //func to parse our json from API. Self tells the compiler to look for the method inside the current class

            print(weatherJSON)
        } else {
            self.cityName.text = "Unable to fetch weather - please check active connection."
        }

    }
}

func updateWeatherData(json: JSON) {
            (...)
             //parse JSON for weather forecast day 1
            weatherDataModel.weatherTest1 = json["list"][0]["weather"][0]["id"].intValue

            //parse JSON for weather forecast day 2
            weatherDataModel.weatherTest2 = json["list"][8]["weather"][0]["id"].intValue

            //parse JSON for weather forecast day 3
            weatherDataModel.weatherTest3 = json["list"][16]["weather"][0]["id"].intValue

            print("TEST variable 1: \(weatherDataModel.weatherTest1)")
            print("TEST variable 2: \(weatherDataModel.weatherTest2)")
            print("TEST variable 3: \(weatherDataModel.weatherTest3)")

输出到控制台的变量与默认值保持不变:

代码语言:javascript
代码运行次数:0
复制
TEST variable 1: 0
TEST variable 2: 0
TEST variable 3: 0
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-14 21:20:05

你用错误的方式解析数据。

json["list"]只是JSON对象而不是数组对象,所以如何通过使用[0]传递索引。

这一问题应按以下解决办法加以纠正。

代码语言:javascript
代码运行次数:0
复制
weatherDataModel.weatherTest1 = json["list"].arrayValue[0]["weather"].arrayValue[0]["id"].intValue
票数 1
EN

Stack Overflow用户

发布于 2018-06-14 22:22:10

在当前版本的SwiftyJSON中,您正在使用的初始化器上的注释如下:

代码语言:javascript
代码运行次数:0
复制
/**
 Creates a JSON object
 - note: this does not parse a `String` into JSON, instead use `init(parseJSON: String)`

 - parameter object: the object

 - returns: the created JSON object
 */

因此,您应该使用let weatherJSON : JSON = JSON(response.result.value!)而不是let weatherJSON : JSON = JSON(parseJSON: response.result.value!)

之后,基于JSON,我认为您当前的代码应该可以工作。

编辑

我知道选择的另一个答案是json"list“是一个JSON对象,而不是一个数组,但是摘录中显示的JSON清楚地表示:

代码语言:javascript
代码运行次数:0
复制
"list" : [
    {

[表示它是一个数组,所以我不确定最初是哪里出了问题。如果有人遇到了同样的问题,并使用init(JSON)解析具有当前版本的SwiftyJSON的对象,我将在这里留下这个答案。

票数 0
EN

Stack Overflow用户

发布于 2018-06-25 01:00:15

如果您正在学习如何在Swift中解析,则必须学习如何构造模型以正确解析JSON。

(顺便说一句,如果您使用Swift 4,不需要使用SWIFTYJson,请在这里了解更多信息:https://benscheirman.com/2017/06/swift-json/)

如果要使用SWIFTYJson,请举一个示例:

代码语言:javascript
代码运行次数:0
复制
struct WeatherDataModel {
    var list = [ListModel]?

    init() {
        self.list = []
    }

    init(json: [String: Any]) {
        if let object = json["list"] as? [[String: Any]] {
            for listJson in object {
                let list = ListModel(json: listJson)
                self.list.append(list)
            }
        }
    }
}

struct ListModel {
    var main : Main?
    var clouds : Clouds?
    var weather : [Weather]?
    init() {
        self.main = Main()
        self.clouds = Clouds()
        self.weather = []
    }
    init(json: [String: Any]) {
        if let mainJson = json["main"] as? [String: Any] {
            self.main = MainModel(json: mainJson)
        }
        if let cloudsJson = json["clouds"] as? [String: Any] {
            self.clouds = CloudsModel(json: cloudsJson)
        }
        if let objectWeather = json["weather"] as? [[String: Any]] {
            for weatherJson in objectWeather {
                let weather = WeatherModel(json: weatherJson)
                self.weather.append(weather)
            }
        }
    }
}

对MainModel,CloudsModel,WeatherModel也这样做

在得到所有模型之后,可以在请求中解析它:

代码语言:javascript
代码运行次数:0
复制
Alamofire.request(url, method: .get, parameters: parameters).validate().responseJSON { (response) -> Void in
        if let value = response.data {
            do {
                let json = try JSON(data: data)
                if let dictionnary = json.dictionnaryObject {
                    let object = WeatherDataModel(json: dictionnary)
                    self.updateWeatherData(data: object)
                }
            } catch {
                print("cannot convert to Json")
            }
        }
 }

然后,您将在方法中找到已经解析的数据对象:

代码语言:javascript
代码运行次数:0
复制
func updateWeatherData(data: WeatherDataModel) {
    // exemple
    print(data.list[0].weather[0].id) // = 800
}

希望它能帮到你。

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

https://stackoverflow.com/questions/50869448

复制
相关文章
超简单网页自动刷新插件介绍
个别场景需要手动刷新页面等待某个结果,刷太频繁,很累,时间长不刷又怕错过,肿么办?
明明如月学长
2021/08/31
4.9K1
超简单网页自动刷新插件介绍
网页刷新方法集合
本文由来源 21aspnet,由 javajgs_com 整理编辑,其版权均为 21aspnet 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。
Java架构师必看
2021/03/22
6790
JSP 防止网页刷新重复提交数据
if session("ok")=true then    response.write "错误,正在提交"    response.end end if
阳光岛主
2019/02/19
11.6K0
怎么自动刷新jwt?
如果用户一直在操作,当jwt颁发的token凭证到了过期时间需要有一个机制能自动延长过期时间。除非用户长时间没有操作,那是需要强制重新登录的。
蛋蛋编程手记
2022/07/27
3.3K0
网页|利用touch实现下拉刷新
下拉刷新在常见的手机app上大多都有运用。下拉刷新即向下拉重新加载、刷新。下拉刷新在下拉到松手的过程中,经历了三个状态分别是:当前手势滑动位置与初始位置差值大于零时,提示正在进行下拉刷新操作。之后当下拉到一定值时,显示松手释放后的操作提示。最后当下拉到达设定最大值松手时,执行回调,提示正在进行更新操作。如下图则为下拉刷新的实现效果:
算法与编程之美
2020/07/16
1.7K0
网页|利用touch实现下拉刷新
自动刷新页面
script> <!--  var limit="0:15" if (document.images){ var parselimit=limit.split(":") parselimit=parselimit[0]*60+parselimit[1]*1 } function beginrefresh(){ if (!document.images) return if (parselimit==1) window.location.reload() else{  parselimit-=1 curmin
张善友
2018/01/19
2.4K0
前端自动刷新工具
Browsersync能让浏览器实时、快速响应您的文件更改(html、js、css、sass、less等)并自动刷新页面。更重要的是 Browsersync可以同时在PC、平板、手机等设备下进项调试。
李维亮
2021/07/09
1.1K0
网页自动提交
昨天的视频python模拟在线测试1。 核心代码: timer = setInterval(function() { // 时间到自动提交试卷 if (count==0){ clearInterval(timer) alert("时间到,已自动交卷") } count--; tag3.innerHTML = showNum(count % 60) tag2.innerHTML = showNum(parseInt(count
叶子陪你玩
2021/12/01
1.6K0
网页自动提交
怎样编写健壮的代码
怎样编写健壮的代码 怎样编写健壮的代码.png 代码的几种特性 鲁棒性Robust(健壮性) 系统在异常和危险情况下生存的关键 容错性 可移植性 反例: 脆弱、僵化、顽固且粘滞性高 如何构建高效、健壮
一个会写诗的程序员
2019/07/08
1.8K0
javascript_时间自动刷新
=========================================================
Hongten
2018/09/13
1.7K0
javascript_时间自动刷新
Weex iOS端的自动刷新和调试
最近开始接触weex。目前weex尚不成熟,官方文档有些粗糙,初学者难免碰壁。这里分享两条我的初学经验,供参考。
全栈程序员站长
2022/07/20
1.2K0
Weex iOS端的自动刷新和调试
如何判断是关闭还是刷新网页
我们在写js代码的时候,经常要判断网页是否被关闭了,如果是被关闭了,就执行某段代码,这个可以用HTML的onbeforeunload事件来执行一段js代码,但是如果网页只是被刷新的话,也同样会触发onbeforeunload事件,下面这段js代码可以判断是否关闭 //判断是关闭还是刷新 if(event.clientX>document.body.clientWidth&&event.clientY<0||event.altKey) {     alert("你关闭了浏览器"); } 这段代码就是判断触发onbeforeunload事件时,鼠标是否点击了关闭按钮,或者按了ALT+F4来关闭网页,如果是,则认为系统是关闭网页,否则在认为系统是刷新网页
源哥
2018/08/28
3K0
通过MySQL自动同步刷新Redis
在服务端开发过程中,一般会使用MySQL等关系型数据库作为最终的存储引擎,Redis其实也可以作为一种键值对型的数据库,但在一些实际场景中,特别是关系型结构并不适合使用Redis直接作为数据库。这俩家伙简直可以用“男女搭配,干活不累”来形容,搭配起来使用才能事半功倍。本篇我们就这两者如何合理搭配以及他们之间数据如何进行同步展开。 一般地,Redis可以用来作为MySQL的缓存层。为什么MySQL最好有缓存层呢?想象一下这样的场景:在一个多人在线的游戏里,排行榜、好友关系、队列等直接关系数据的情景下,如果直接
逸鹏
2018/04/11
7.9K0
通过MySQL自动同步刷新Redis
Bus集成webhooks实现自动刷新
内网穿透网站:https://natapp.cn/ 我需要将127.0.0.1:8848利用内网穿透映射成为公网地址,所以注意如下配置:
别团等shy哥发育
2023/02/25
9190
Bus集成webhooks实现自动刷新
网页自动跳转_网页跳转到其他网站
关闭浏览器,然后删除c:/program files/Internet Explorer/3348201013.dat
全栈程序员站长
2022/11/10
2.1K0
vue监听页面刷新事件_vue监听数据变化自动刷新
注意:有返回值(’ ‘,true,false…都可以)才能弹出显示,或者有需要执行的事件也行。
全栈程序员站长
2022/11/01
5.8K0
[开发技巧]·html实现返回页面并自动刷新
在进行APP开发或作制作网站时,有时候会遇到你下一级页面操作过以后会改变上一级页面的结果。这时候就需要我们去刷新上一级页面。 一般可以采取三种方式:
小宋是呢
2019/06/27
6.1K0
springboot+idea热部署(自动刷新)
spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用。
全栈程序员站长
2022/09/14
1.6K0
springboot+idea热部署(自动刷新)
用Python写网页的自动签到
2.下载chromedriver驱动; 找到符合自己浏览器版本的chromedriver驱动,下载解压后,将chromedriver.exe文件放到Python目录下的Scripts目录下,也可以添加环境变量到Path中。
用户2590762
2021/08/11
2.5K0
点击加载更多

相似问题

当窗口调整大小时,如何使div不收缩?

13

在Chrome中调整flexbox大小时避免滚动条?

10

Flexbox元素在调整窗口大小时重叠

23

CSS Flexbox:沿交叉轴收缩并显示滚动条

30

当窗口调整大小时,画布拒绝展开或收缩。

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文