昨天看到技术群中发了一个查询天气的 api,http://www.sojson.com/open/api/weather/json.shtml?city= 南昌
  点进去看,发现服务器传回来一个天气信息的 json,刚好也在学 C# 解析 json,就干脆拿这个作为一个实例了。
  首先,介绍一下 Json:
  Json 其实就是 JavaScript 里面的对象和数组,通过不同的组合,可以构成许多不同的数据结构。其中使用花括号的是对象,中括号的是数组,例如:

{

"data":

    {

        "people":

        [

            {"name":"ppppp","age":18}

        ]

    }

}

  这里面,data 就是一个对象,而 people 就是一个数组。
首先前往 Json 官网下载对应的 dll 文件并应用。这里博主使用的是 LitJson。
首先分析天气查询返回来的 Json 的结构。
Json
  结构和层级很明了。
  上完整 Json:

{
"data": {
"yesterday": {
"date": "4 日星期二",
"high": "高温 32℃",
"fx": "无持续风向",
"low": "低温 25℃",
"fl": "微风",
"type": "多云"
},
"city": "南昌",
"aqi": "33",
"forecast": [
{
"date": "5 日星期三",
"high": "高温 34℃",
"fengli": "微风级",
"low": "低温 27℃",
"fengxiang": "无持续风向",
"type": "多云"
},
{
"date": "6 日星期四",
"high": "高温 35℃",
"fengli": "微风级",
"low": "低温 27℃",
"fengxiang": "无持续风向",
"type": "晴"
},
{
"date": "7 日星期五",
"high": "高温 35℃",
"fengli": "微风级",
"low": "低温 27℃",
"fengxiang": "无持续风向",
"type": "多云"
},
{
"date": "8 日星期六",
"high": "高温 34℃",
"fengli": "微风级",
"low": "低温 26℃",
"fengxiang": "无持续风向",
"type": "多云"
},
{
"date": "9 日星期天",
"high": "高温 33℃",
"fengli": "微风级",
"low": "低温 27℃",
"fengxiang": "无持续风向",
"type": "多云"
}
],
"ganmao": "各项气象条件适宜,发生感冒机率较低。但请避免长期处于空调房间中,以防感冒。",
"wendu": "32"
},
"status": 200,
"message": "OK"
}

  分析之后可以知道,data,status,message 属于同一层级,而且 data 和 yesterday 属于对象,forecast 是一个数组。
  LitJson 中有 JsonData 类和 JsonMapper 类,其中 JsonMapper 类用于解析 Json 文本
  具体使用方法如下

JsonData jsonData = JsonMapper.ToObject(Json);// 这里会返回 JsonData 的对象

foreach(JsonData temp in jsonData)//temp 中有索引器

{

    JsonData id = temp["index"]

}

在这里我们不去使用索引的方法去获得每一个对应数据,我们使用泛型匹配。
首先需要定义数据类,类成员名必须和 Json 文本内相同

public class Eaxmple
{
    public string A;
    public string B;
    public int C;
    public override string ToString()// 必须要重写 Tostring

    {
        return string.Format("A:{0},B:{1},C:{2}", A, B, C);
    }
}

泛型解析

string json;

Eaxmple ex= JsonMapper.ToObject<Eaxmple>(json);

Console.WriteLine(ex);

通过以上内容,我们可以对查询天气的 api 进行 Json 解析了。
// 定义 Json 类,其中包含一个 data 对象和 status,message

public class JsonContent
{
    public int status { get; set; }
    public Data data { get; set; }
    public string message { get; set; }
    public override string ToString()
    {
        return string.Format("status{0},message{1}\n{2}", status, message, data);
    }

}
// 再定义 Data 类,
public class Data
{
    public string city { get; set; }
    public string ganmao { get; set; }
    public string wendu { get; set; }
    public List<Forecast> forecast { get; set; }// 这里的数组我们用集合的方式代替
    public override string ToString()
    {
        return string.Format("{0} 的天气是:\n 注意:{1}\n 温度 {2}", city, ganmao, wendu);
    }
}

// 最后一个 Forecast 类

public class Forecast
{
    public string date;
    public string high;
    public string fengxiang;
    public string low;
    public string fengli;
    public string type;

    public override string ToString()
    {
        return string.Format("日期:{0}, 最高气温:{1}, 最低气温:{2}, 风向:{3}, 风力:{4}, 天气:{5}", date, high, low, fengxiang, fengli, type);
    }
}

这样的话,每一个属性或者字段就和 json 的文本对应上了,我们现在使用 LitJson 解析

// 从指定网站获得数据
public static string GetUrlContent(string urladdress)
{
    WebClient MyWebClient = new WebClient();
    MyWebClient.Credentials = CredentialCache.DefaultCredentials;
    Byte[] pageData = MyWebClient.DownloadData(urladdress);
    string pageHtml = Encoding.UTF8.GetString(pageData);
    return pageHtml;
}

static void Main(string[] args)
{
    Console.Write("要查询的城市:");
    string City = Console.ReadLine();
    string json = GetJson.GetUrlContent(@"http://www.sojson.com/open/api/weather/json.shtml?city=" + City);
    JsonContent jsonc = JsonMapper.ToObject<JsonContent>(json);
    Console.WriteLine(jsonc);
    foreach (var temp in jsonc.data.forecast)
    {
        Console.WriteLine(temp);
    }
    Console.Read();

}

Json

我的掘金:WarrenRyan

我的简书:WarrenRyan

欢迎关注我的博客获得第一时间更新 https://blog.tity.xyz

我的 Github:StevenEco

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:PipeSoloSymWide 等,欢迎大家加入,贡献开源。

    3318 引用 • 3947 回帖 • 653 关注
  • .NET
    9 引用 • 3 回帖 • 3 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    31 引用 • 155 回帖
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    34 引用 • 265 回帖
感谢    关注    收藏    赞同    反对    举报    分享