现代操作系统应用开发之UWP开发 | API的获取以及C#中Json的解析(天气预报的获取和历史上的今天查询)

本文介绍了在UWP应用开发中如何使用C#解析Json数据,特别是通过Newtonsoft.Json类库解决报错问题。作者分享了从选择API(以天气预报为例)到获取实体类,再到实现Json解析方法的详细步骤,并提供了完整的代码示例。
摘要由CSDN通过智能技术生成

做这个小程序的时候,看了好多网上的Json解析的方法,主要流行的是使用Newtonsoft.Json类库来实现, 我也下载了并照着做,但是出一些奇怪的报错并不知道怎么解决,然后看了一个Bob Tabor大叔的一节视频,发现讲的简单易懂,实现起来也非常简单,现在就展示一下这种方法(博客最底部有完整源代码)

这里是整个项目文件压缩包的传送门,点击这里

结果展示

这里写图片描述

这里写图片描述

1、API选择

  • 这里我用的是阿凡达数据,选择的是实现天气预报的接口。
  • 进去该网站之后,按照江湖规矩先注册登录,找到想要找的API点击右边的申请数据(一般API都有查询次数的限制,有的还需要付费)
    这里写图片描述
  • 然后再返回这个页面就可以看到能够使用了
    这里写图片描述
  • 点击申请示例看下得到的数据是什么样纸
    这里写图片描述

2、获取实体类

  • 上面能够成功返回Json类型的文本,但是还是不很清楚数据之间的联系,我们用到一个转换Json为C#的网站点这里**(别的博客也有推荐一些转换的网站,但是会有问题,比如我这里的Json里面有两个PM25,某些网站就会将这两个类都叫PM25,造成类名重复,后面就很麻烦,而这个网站能够自己加后缀区分相同名称的类)**将那些看不懂的数据转换为比较有结构的C#实体类,把上面示例得到的Json文本复制进去点击Generate就好了,就是下面这个样子了
    这里写图片描述
    证明一下类名相同的情况
    这里写图片描述
    然后呢,直接把得到的C#实体类复制,待会要用

3、实现解析Json返回实体类的方法(?或者叫做函数)

  • 到现在还没创建项目,在VS中创建好一个新项目,新建一个类叫做OpenHistoryToday,然后在这个类的外面粘贴刚刚得到的实体类
    这里写图片描述
  • 可以看到OpenHistoryToday中我还写了一个方法叫做GetWeather,这个就是核心的代码了,现在看看这个怎么写的
public async static Task<RootObject> GetWeather(String city)
        {
            Uri uri = new Uri(uriString: "http://api.avatardata.cn/Weather/Query?key=0151ec4ce80149ef8ba24b197c36a44f&cityname=" + city);//Uri页面为Json字符串或XML字符串

            HttpClient client = new HttpClient();
            var response = await client.GetAsync(uri);
            var result = await response.Content.ReadAsStringAsync();
            var serializer = new DataContractJsonSerializer(typeof(RootObject));

            var ms = new MemoryStream(Encoding.UTF8.GetBytes(result));
            var data = (RootObject)serializer.ReadObject(ms);

            return data;
        }
  • 因为是异步的方法,所以要用Task修饰,表示在执行查询及解析的过程中返回的数据可能不是RootObject类型,而是一种临时的数据类型,等到数据完全解析成功之后返回RootObject,具体如图(这里的额RootObject是得到数据的最顶层类,认真看看刚刚得到的实体类,需要理清一下关系,应该不难)
  • 这里做的工作就是先用数据API的网址创建一个Uri,再创建一个HttpClient并通过异步的方法获取该Uri返回的数据,通过程序集 System.Runtime.Serialization.Json里面的DataContractJsonSerializer类的ReadObject方法返回RootObject类型的变量(还是System自带的程序包好用啊!)
  • 对了,直接这样的话有问题,可以发现上面中我的实体类前面加了点东西,因为需要在每个类前面加上Attribute的数据契约关键字([DataContract]),以及在类的成员
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值