json - Swift JSON 解析 Wunderground

标签 json swift parsing

我是一个快速编程的初学者,我需要来自 JSON 的值,它看起来像这样:

{
  "response": {
  "version":"0.1",
  "termsofService":"http://www.wunderground.com/weather/api/d/terms.html",
  "features": {
  "astronomy": 1
  }
    }
        ,   "moon_phase": {
        "percentIlluminated":"23",
        "ageOfMoon":"5",
        "phaseofMoon":"Erstes Viertel",
        "hemisphere":"North",
        "current_time": {
        "hour":"8",
        "minute":"28"
        },
        "sunrise": {
        "hour":"6",
        "minute":"55"
        },
        "sunset": {
        "hour":"19",
        "minute":"50"
        },
        "moonrise": {
        "hour":"9",
        "minute":"50"
        },
        "moonset": {
        "hour":"0",
        "minute":"06"
        }
    },
    "sun_phase": {
        "sunrise": {
        "hour":"6",
        "minute":"55"
        },
        "sunset": {
        "hour":"19",
        "minute":"50"
        }
    }
}

我将从日落和日出开始的小时和分钟转换为变量!

我的代码:

 var sunriseHour: [String] = []
    var sunriseMinute: [String] = []
    var sunsetHour: [String] = []
    var sunsetMinute: [String] = []

    override func viewDidLoad() {
        super.viewDidLoad()


        let url=URL(string:"http://api.wunderground.com/api/dbd539bd631e/astronomy/lang:DL/q/DL/iphofen.json")
        do {
            let allData = try Data(contentsOf: url!)
            let data = try JSONSerialization.jsonObject(with: allData, options: JSONSerialization.ReadingOptions.allowFragments) as! [String : AnyObject]
            if let arrJSON = data["moon_phase"] {


                        if let sunriseData = arrJSON["sunrise"]{



                print(sunriseData)
                                        }
                if let sunsetData = arrJSON["sunset"]{

             print(sunsetData)
                }
           }
            print("hour: ",sunriseHour)
            print("minute: ",sunriseMinute)
            print("hour: ",sunsetHour)
            print("minute: ",sunsetMinute)


        }
        catch {

        }

            }

我通过 print(sunriseData) 和 print(sunsetData) 得到了正确的数据:

Optional({ hour = 6; minute = 55; }) Optional({ hour = 19; minute = 50; }) hour: [] minute: [] hour: [] minute: []

如何在变量 sunriseHour、sunriseMinute、sunsetHour、sunsetMinute 中获取它。

感谢您的帮助..!

最佳答案

所有小时分钟值都是(单个)字符串而不是[String](数组)。

将所有变量声明为空字符串

var sunriseHour = ""
var sunriseMinute = ""
var sunsetHour = ""
var sunsetMinute = ""

然后不要从远程 URL 同步加载数据,始终使用异步方式:

       let url = URL(string:"http://api.wunderground.com/api/dbd539bd631e/astronomy/lang:DL/q/DL/iphofen.json")!

        let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
            if error != nil {
                print(error!)
            } else {
                do {
                    guard let jsonData = try JSONSerialization.jsonObject(with:data!) as? [String:Any],
                          let moonPhase = jsonData["moon_phase"] as? [String:Any] else { return }

                    let sunrise = moonPhase["sunrise"] as! [String:String]
                    let sunset = moonPhase["sunset"] as! [String:String]

                    sunriseHour = sunrise["hour"]!
                    sunriseMinute = sunrise["minute"]!

                    sunsetHour = sunset["hour"]!
                    sunsetMinute = sunset["minute"]!

                    print("Sunrise - \(sunriseHour):\(sunriseMinute)"
                    print("Sunset - \(sunsetHour):\(sunsetMinute)"

                } catch {
                    print(error)
                }
            }
        }
        task.resume()

日出日落的数据位于从moon_phase派生的字典中。所有值都被强制展开,因为日出和日落应该每天都存在;-)

PS:考虑定义更具描述性的变量名,arrJSON意义不大。

关于json - Swift JSON 解析 Wunderground,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43156668/

相关文章:

java - JsonParseException 反序列化对象失败

ios - Xcode - Swift - 文本的 UILabel 高度扩展

python - 如何处理没有结尾斜杠的空 HTML 元素?

linux - 从邮件头解析发件人原始IP的Perl脚本

java - 将 xml 字符串转换为 JSON 字符串,而不使用第三方库

ruby-on-rails - Rails Active 模型序列化器返回数组而不是 json

PYTHON for 循环通过 dict_keys 和 UDP 发送

ios - 是否可以在后台模式下收到远程推送通知时多次振动?

swift - SpriteKit 中的掩蔽和物理

java - 如何替换 URL 字符串中的特定 '&' 进行解析