做这个小程序的时候,看了好多网上的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]),以及在类的成员