Python: OpenWeatherMap json Deserialization of Python Objects

openweathermap.json
{
	"coord": {
		"lon": 114.0683, "lat":22.5455
	}

	,
	"weather":[ {
		"id": 803, "main":"Clouds", "description":"多雲", "icon":"04d"
	}

	],
	"base":"stations",
	"main": {
		"temp": 299.1, "feels_like":299.1, "temp_min":296.39, "temp_max":300.29, "pressure":1018, "humidity":79, "sea_level":1018, "grnd_level":1017
	}

	,
	"visibility":10000,
	"wind": {
		"speed": 2.73, "deg":137, "gust":3.32
	}

	,
	"clouds": {
		"all": 82
	}

	,
	"dt":1702530001,
	"sys": {
		"type": 2, "id":2031340, "country":"CN", "sunrise":1702508106, "sunset":1702546869
	}

	,
	"timezone":28800,
	"id":1795565,
	"name":"Shenzhen",
	"cod":200
}

  

# encoding: utf-8
# 版權所有 2023 塗聚文有限公司
# 許可信息查看:
# 描述:
# Author    : geovindu,Geovin Du 塗聚文.
# IDE       : PyCharm 2023.1 python 3.11
# Datetime  : 2023/12/14 22:14
# User      : geovindu
# Product   : PyCharm
# Project   : pyBaiduAi
# File      : Clouds.py
# explain   : 學習

import json
import pickle
from typing import List
from typing import Any
from dataclasses import dataclass



@dataclass
class Clouds:
    all: int

    @staticmethod
    def from_dict(obj: Any) -> 'Clouds':
        _all = int(obj.get("all"))
        return Clouds(_all)


@dataclass
class Coord:
    lon: float
    """
    經度
    """
    lat: float
    """
    緯度
    """
    @staticmethod
    def from_dict(obj: Any) -> 'Coord':
        _lon = float(obj.get("lon"))
        _lat = float(obj.get("lat"))
        return Coord(_lon, _lat)


@dataclass
class Main:
    """

    """
    temp: float
    """
    溫度 
    """

    feels_like: float
    temp_min: float
    """
    最低溫
    """
    temp_max: float
    """
    最高溫
    """
    pressure: int
    humidity: int
    """
    溼魔
    """
    sea_level: int
    grnd_level: int

    @staticmethod
    def from_dict(obj: Any) -> 'Main':
        _temp = float(obj.get("temp"))
        _feels_like = float(obj.get("feels_like"))
        _temp_min = float(obj.get("temp_min"))
        _temp_max = float(obj.get("temp_max"))
        _pressure = int(obj.get("pressure"))
        _humidity = int(obj.get("humidity"))
        _sea_level = int(obj.get("sea_level"))
        _grnd_level = int(obj.get("grnd_level"))
        return Main(_temp, _feels_like, _temp_min, _temp_max, _pressure, _humidity, _sea_level, _grnd_level)


@dataclass
class Sys:
    """
    系統信息
    """
    type: int
    id: int
    country: str
    """
    所屬國家
    """
    sunrise: int
    """
    日出時間戳
    """
    sunset: int
    """
    日落時間戳
    """

    @staticmethod
    def from_dict(obj: Any) -> 'Sys':
        _type = int(obj.get("type"))
        _id = int(obj.get("id"))
        _country = str(obj.get("country"))
        _sunrise = int(obj.get("sunrise"))
        _sunset = int(obj.get("sunset"))
        return Sys(_type, _id, _country, _sunrise, _sunset)


@dataclass
class Weather:
    """
    天氣情況
    """
    id: int
    main: str
    description: str
    """
    天氣
    """
    icon: str
    """
    圖標ID
    """

    @staticmethod
    def from_dict(obj: Any) -> 'Weather':
        _id = int(obj.get("id"))
        _main = str(obj.get("main"))
        _description = str(obj.get("description"))
        _icon = str(obj.get("icon"))
        return Weather(_id, _main, _description, _icon)


@dataclass
class Wind:
    """
    風況
    """
    speed: float
    """
    風速
    """
    deg: int
    gust: float

    @staticmethod
    def from_dict(obj: Any) -> 'Wind':
        _speed = float(obj.get("speed"))
        _deg = int(obj.get("deg"))
        _gust = float(obj.get("gust"))
        return Wind(_speed, _deg, _gust)

@dataclass
class OpenWeather:
    """"
    天氣類
    """
    coord: Coord
    weather: List[Weather]
    base: str
    main: Main
    visibility: int
    wind: Wind
    clouds: Clouds
    dt: int
    sys: Sys
    timezone: int
    id: int
    name: str
    cod: int

    @staticmethod
    def from_dict(obj: Any) -> 'OpenWeather':
        _coord = Coord.from_dict(obj.get("coord"))
        _weather = [Weather.from_dict(y) for y in obj.get("weather")]
        _base = str(obj.get("base"))
        _main = Main.from_dict(obj.get("main"))
        _visibility = int(obj.get("visibility"))
        _wind = Wind.from_dict(obj.get("wind"))
        _clouds = Clouds.from_dict(obj.get("clouds"))
        _dt = int(obj.get("dt"))
        _sys = Sys.from_dict(obj.get("sys"))
        _timezone = int(obj.get("timezone"))
        _id = int(obj.get("id"))
        _name = str(obj.get("name"))
        _cod = int(obj.get("cod"))
        return OpenWeather(_coord, _weather, _base, _main, _visibility, _wind, _clouds, _dt, _sys, _timezone, _id, _name, _cod)

  

 

# encoding: utf-8
# 版權所有 2023 ©塗聚文有限公司
# 許可信息查看:
# 描述:
# Author    : geovindu,Geovin Du 塗聚文.
# IDE       : PyCharm 2023.1 python 311
# Datetime  : 2023/12/15 8:13
# User      : geovindu
# Product   : PyCharm
# Project   : EssentialAlgorithms
# File      : DateTimeHelper.py
# explain   : 學習

import time
import datetime


class TimeHelper(object):
    """
    時間轉換
    """

    @staticmethod
    def gettime(timeStamp:int):
        """
        時間戳轉成日期時間
        :param timeStamp:
        :return:
        """
        timeArray = time.localtime(timeStamp)
        #timeArray = datetime.datetime.utcfromtimestamp(timeStamp)
        #beikingStyleTime =datetime.datetime.utcfromtimestamp(timeStamp)# time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
        #beijing_timezone = datetime.timezone(datetime.timedelta(hours=8))
        #beikingStyleTime = utc_time.astimezone(beijing_timezone)
        beikingStyleTime=time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
        return beikingStyleTime

    @staticmethod
    def getTimeStamp(nowdatetime:datetime.datetime):
        """
        由 datetime對象 轉換爲 時間戳
        :param nowdatetime
        :return:
        """

        year=nowdatetime.year
        month=nowdatetime.month
        day=nowdatetime.day
        hour=nowdatetime.hour
        minute=nowdatetime.minute
        seconde=nowdatetime.second
        timeArray = nowdatetime.strftime("%Y-%m-%d %H:%M:%S") #'2023-12-31 09:30:18'
        timeStamp = time.mktime(timeArray)
        return  timeStamp

    @staticmethod
    def getDateTime(timeStamp:int):
        """
        時間戳轉成日期時間
        :param timeStamp:
        :return:
        """
        #無效
        #dateArray = datetime.datetime.utcfromtimestamp(timeStamp)
        #beikingStyleTime = dateArray.strftime("%Y-%m-%d %H:%M:%S")

        beikingStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(timeStamp))

        return beikingStyleTime

    @staticmethod
    def getDateTimeStamp(nowdatetime: datetime.datetime):
        """
        由 datetime對象 轉換爲 時間戳
        :param nowdatetime
        :return:
        """
        year = nowdatetime.year
        month = nowdatetime.month
        day = nowdatetime.day
        hour = nowdatetime.hour
        minute = nowdatetime.minute
        seconde = nowdatetime.second
        dateArray = datetime.datetime(year=year, month=month, day=day, hour=hour, minute=minute, second=seconde)
        timeStamp = dateArray.timestamp()
        return timeStamp


    @staticmethod
    def getFTC(ff: float):
        """
        華氏度轉攝氏度
        攝氏度(℃)、華氏度(℉)、開氏度(K)、列氏度(°Re)、蘭氏度(°R)溫度單位數據
        :param ff:
        :return:
        """
        temperature = str(round(((ff - 32) / 1.8000), 2))+'℃'
        return temperature

    @staticmethod
    def getKTC(kk: float):
        """
        開爾文轉攝氏度
        :param kk:
        :return:
        """
        temperature = str(round((kk - 273.15), 2))+'℃'
        return temperature

  

 

 

 調用:

import Common.DateTimeHelper
import Model.Clouds
import Model.openWeatherMapInfo
import Common.LanguageList
import BLL.OpenWeatherMap
import requests




def print_hi(name):
    # Use a breakpoint in the code line below to debug your script.
    print(f'Hi, {name}')  # Press Ctrl+F8 to toggle the breakpoint.


# Press the green button in the gutter to run the script.
if __name__ == '__main__':

    print_hi('PyCharm,python,geovindu,Geovin Du,塗聚文,你好!')
    bll=BLL.OpenWeatherMap.openWeatherMap()
    dtime = Common.DateTimeHelper
    #ob = bll.getObject("1795565")
    geovindu=bll.getObject("1795565",Common.LanguageList.Lang.zh_cn.name)
    print("ob",geovindu)
    print("城市:", geovindu.name)
    print("溼度", str(geovindu.main.humidity) + '%')
    print("天氣:", geovindu.weather[0].description)
    print("日出:", dtime.TimeHelper.getDateTime(geovindu.sys.sunrise))
    print("日落:", dtime.TimeHelper.getDateTime(geovindu.sys.sunset))
    print("溫度:", dtime.TimeHelper.getKTC(geovindu.main.temp))
    print("最低溫度:", dtime.TimeHelper.getKTC(geovindu.main.temp_min))
    print("最高溫度:", dtime.TimeHelper.getKTC(geovindu.main.temp_max))

    # deserialization process:
    with open('openweathermap.json', encoding='utf-8') as json_file:
        data = json.load(json_file)
        print("data from file:")
        print(type(data))
        root = Model.Clouds.OpenWeather.from_dict(data)
        print(root)
        print("城市:", root.name)
        print("溼度", str(root.main.humidity)+'%')
        print("天氣:", root.weather[0].description)
        #1.
        #print("日出:", dtime.TimeHelper.gettime(root.sys.sunrise))
        #print("日落:", dtime.TimeHelper.gettime(root.sys.sunset))
        #2.
        print("日出:", dtime.TimeHelper.getDateTime(root.sys.sunrise))
        print("日落:", dtime.TimeHelper.getDateTime(root.sys.sunset))
        print("溫度:",dtime.TimeHelper.getKTC(root.main.temp))
        print("最低溫度:", dtime.TimeHelper.getKTC(root.main.temp_min))
        print("最高溫度:", dtime.TimeHelper.getKTC(root.main.temp_max))

  

 

 輸出

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章