一、天氣查詢API
獲取天氣信息,首先要找到提供天氣數據的接口,我使用的是高德地圖免費為我們提供的,網址為 https://lbs.amap.com/api/webservice/guide/api/weatherinfo
使用的前提是注冊一個高德賬號用來獲取返回參數中所需要的key,步驟很簡單,按照網址中的提示來就可以了。
二、獲取JSON數據
獲取網絡數據,需要用到UnityWebRequest類,通過它的Get方法可以得到網址中的信息,返回的是含有URI中數據的UnityWebRequest對象。
UnityWebRequest re = UnityWebRequest.Get(string uri);
接下來使用它的 downloadHandler 方法來管理從遠程服務器中接受的數據(想了解更多用法可以去看官方文檔)
string JsonData = re.downloadHandler.text; //text返回的是通過UTF-8編碼的字符串
好了,現在我們已經擁有JSON類型的天氣數據了
三、JSON對象序列化和反序列化
序列化是將對象轉化為字節序列的過程。在Unity中可以使用其自帶的類進行序列化和反序列化 -> JsonUtility,下面是它包含的方法
我們只需要使用它的FormJson方法來創建對象,官方給出的案例是
using UnityEngine; [System.Serializable] public class PlayerInfo { public string name; public int lives; public float health; public static PlayerInfo CreateFromJSON(string jsonString) { return JsonUtility.FromJson<PlayerInfo>(jsonString); } // Given JSON input: // {"name":"Dr Charles","lives":3,"health":0.8} // this example will return a PlayerInfo object with // name == "Dr Charles", lives == 3, and health == 0.8f. }
在內部,此方法使用 Unity 序列化器;因此創建的類型必須受序列化器支持,它必須是使用 Serializable 屬性標記的普通類/結構,並且為public類型,天氣數據也可以用類似方法進行讀取
//定義結構體存儲json返回的天氣信息 [Serializable] public struct MainJson { public string status; public string count; public string info; public string infocode; public List<LiveInfo> lives; } [Serializable] public struct LiveInfo { public string provice; public string city; public string adcode; public string weather; public string temperature; public string winddirection; public string windpower; public string humidity; public string reporttime; } MainJson j = JsonUtility.FromJson<MainJson>(re.downloadHandler.text); if (j.status == "0") { print(j.info); } else { string cityName = j.lives[0].provice + j.lives[0].city; }
這是我寫的一個小demo(不是完整代碼)。
值得注意的是,結構體中定義的變量名要和JSON中的數據一致,名稱一致,不需要的數據可以不定義。 下面是效果圖