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

                      

      

  • 相关阅读:
    【原创】编程题练习:反转字符串中的单词
    【最近的学习安排】
    【转载】判断两个链表是否相交、一个链表是否有环
    获取字符串字节长度
    如何找到GridView里的控件,建立GridViewRow对象
    Flex和.NET协同开发利器FluorineFx Flex与.NET互操作
    两款基于Visual Studio开发Flex的插件
    Mysql:向信号量添加给定计数将导致其超出它的最大计数错误
    Sql Server数据库触发器实例
    国外一些知名ASP.Net开源CMS系统
  • 原文地址:https://www.cnblogs.com/forever-Ys/p/11736408.html
Copyright © 2011-2022 走看看