zoukankan      html  css  js  c++  java
  • Unity3D 通过JSON查询天气

    一、天气查询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中的数据一致,名称一致,不需要的数据可以不定义。 下面是效果图

                      

      

  • 相关阅读:
    上传图片到PHP服务器
    关于对象、数字、地理位置使用上需要注意的地方
    apiCloud app调用浏览器打开网页的方法
    APICloud开发小技巧(一)
    JavaScript数组操作函数
    超实用的JavaScript代码段
    JSESSIONID的简单说明
    数据库锁表及阻塞的原因和解决办法
    Spring详解------事务管理
    HttpServletrequest 与HttpServletResponse总结
  • 原文地址:https://www.cnblogs.com/forever-Ys/p/11736408.html
Copyright © 2011-2022 走看看