现代操作系统应用开发:网络编程(一):Json字符串和Xml字符串解析

功能简介

好久没写博客了,└༼ ಥ ᗜ ಥ ༽┘!!!

很简单的功能:分别使用System.Xml.XmlDocumentWindows.Data.Json 解析并提取服务器端传来的Xml字符串和Json字符串,这里使用聚合数据API 提供的数据,Xml字符串提供12306火车票查询,Json字符串提供天气查询,示例项目将通过返回的字符串提取我们想要的数据并显示出来

实现效果

  • Json:天气查询

  • Xml:12306 火车票查询

  • 输入错误,异常判断

实现过程

获得数据

首先,我们需要从聚合数据中获得数据并且知道返回的数据的格式,在聚合数据上注册,申请数据(部分数据的需要收费,这里使用的天气查询和12306查询首次申请将赠送500次使用次数),将得到下面的结果:

选择一个接口,如天气查询,我们将使用并解析该接口的返回数据得到我们需要的信息,返回的Json字符串如下所示

/* 聚合数据返回的Json字符串数据示例 */
{
    "resultcode": "200",
    "reason": "查询成功!",
    "result": {
        /* 该接口返回了相当详细的数据,可以查看官网获得更多信息
         * 这里省略了大部分的内容,只显示出了该次实验需要提取的数据 
         */
        "today": {
            "city": "天津",
            "date_y": "2014年03月21日",
            "week": "星期五",
            "temperature": "8℃~20℃",   /*今日温度*/
            "weather": "晴转霾",   /*今日天气*/
            "weather_id": { /*天气唯一标识*/
                "fa": "00", /*天气标识00:晴*/
                "fb": "53"  /*天气标识53:霾 如果fa不等于fb,说明是组合天气*/
            },
    }
}

另一个例子是火车票查询接口,这里我们通过解析Xml字符串获得我们需要的信息

<?xml version="1.0" encoding="utf-8"?>
<root>
  <resultcode>200</resultcode>
  <reason>查询成功</reason>
  <result>
    <train_info>
      <name>g4</name>
      <start>上海虹桥</start>
      <end>北京南</end>
      <starttime>14:00</starttime>
      <endtime>18:28</endtime>
      <mileage/>
    </train_info>
    <station_list>
        <!-- 这里省略了一下这次项目没有使用的值,可以查看官网获得更多信息 -->
    </station_list>
  </result>
</root>

在MainPage.xaml中添加需要的控件

在这里,我们添加两个文本输入框和两个按钮,用于输入我们的信息

<!-- MainPage.xaml -->
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <StackPanel  Margin="10">
        <TextBox Header="City" Margin="10" x:Name="cityBox"></TextBox>
        <Button Content="查询天气" Click="queryWeather" Margin="10" x:Name="button"></Button>
        <TextBox Header="Train Id"  Margin="10" x:Name="trainBox"></TextBox>
        <Button Content="12306火车票查询" Click="queryTrain" Margin="10"></Button>
    </StackPanel>
</Grid>

在MainPage.xaml.cs中添加代码

  • 添加对应的成员
//MainPage.xaml.cs
/*
 * 以查询火车票为例,
 * 一般的查询链接为:http://apis.juhe.cn/train/s?name=你想要查询的火车的编号&key=你申请的APPKEY
 * 因此根据下面的string对象,在查询时将使用:trainStr + 你想要查询的火车的编号 + trainKey
 */
private string trainStr = "http://apis.juhe.cn/train/s?dtype=xml&name=";
private string weatherStr = "http://v.juhe.cn/weather/index?format=2&cityname=";
//App Key,唯一标识,这里需要替换为你注册申请的链接
private string trainKey = "&key=9ec62157b998149569d54ae25cbaa8e5";
private string weatherKey = "&key=0e3c2dab2c8a77f4bac1138099a812ea";
  • 对Json字符串进行解析(查询天气):
//MainPage.xaml.cs
private async void queryWeather(object sender, RoutedEventArgs e)
{
    // 根据输入得到Url链接
    string url = weatherStr + cityBox.Text.Trim() + weatherKey;
    HttpClient httpClient = new HttpClient();
    var headers = httpClient.DefaultRequestHeaders;
    //使用HttpClient获取数据
    HttpResponseMessage response = await httpClient.GetAsync(url);

    // 避免中文乱码
    response.EnsureSuccessStatusCode();
    Byte[] getByte = await response.Content.ReadAsByteArrayAsync();
    Encoding code = Encoding.GetEncoding("UTF-8");
    string jsonString = code.GetString(getByte, 0, getByte.Length);

    // 解析Json对象
    JsonObject weatherObject = JsonObject.Parse(jsonString);
    // 如果输入正确,返回的Json字符串的resultcode = 200
    if (weatherObject.GetNamedString("resultcode").Equals("200"))
    {
        //根据上面的Json字符串进行解析,得到Json字符串中嵌套的Json字符串
        JsonObject skObject = JsonObject.Parse(weatherObject.GetNamedValue("result").ToString());
        JsonObject todayObject = JsonObject.Parse(skObject.GetNamedValue("today").ToString());
        // 使用StringBuilder,可变字符串
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.Append("气温 : " + todayObject.GetNamedString("temperature"));
        stringBuilder.Append("\n");
        stringBuilder.Append("天气 : " + todayObject.GetNamedString("weather"));
        stringBuilder.Append("\n");
        stringBuilder.Append("风向 : " + todayObject.GetNamedString("wind"));
        stringBuilder.Append("\n");
        MessageDialog showDialog = new Windows.UI.Popups.MessageDialog(stringBuilder.ToString());
        await showDialog.ShowAsync();
    }
    else
    {
        //异常判断
        MessageDialog errorDialog = new Windows.UI.Popups.MessageDialog("输入错误!!!");
        await errorDialog.ShowAsync();
    }
}
  • 对Xml字符串进行解析(火车票查询):
private async void queryTrain(object sender, RoutedEventArgs e)
{
    // 根据输入得到Url链接
    string url = trainStr + trainBox.Text.Trim() + trainKey;
    HttpClient httpClient = new HttpClient();
    var headers = httpClient.DefaultRequestHeaders;
    //使用HttpClient获取数据
    HttpResponseMessage response = await httpClient.GetAsync(url);

    // 避免中文乱码
    response.EnsureSuccessStatusCode();
    Byte[] getByte = await response.Content.ReadAsByteArrayAsync();
    Encoding code = Encoding.GetEncoding("UTF-8");
    string xmlString = code.GetString(getByte, 0, getByte.Length);

    // 根据返回的Xml字符串创建Xml对象
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xmlString);
    XmlNode root = doc.DocumentElement;
    // 如果输入正确,返回的Json字符串的resultcode = 200
    if (doc.GetElementsByTagName("resultcode")[0].InnerText.Equals("200"))
    {
        //根据上面的Xml字符串进行解析
        XmlNodeList child = doc.GetElementsByTagName("train_info")[0].ChildNodes;

        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.Append("车次 : " + child[0].InnerText);
        stringBuilder.Append("\n");
        stringBuilder.Append("出发站 : " + child[1].InnerText);
        stringBuilder.Append("\n");
        stringBuilder.Append("到达站 : " + child[2].InnerText);
        stringBuilder.Append("\n");
        stringBuilder.Append("出发时间 : " + child[3].InnerText);
        stringBuilder.Append("\n");
        stringBuilder.Append("到达时间 : " + child[4].InnerText);
        stringBuilder.Append("\n");
        MessageDialog showDialog = new Windows.UI.Popups.MessageDialog(stringBuilder.ToString());
        await showDialog.ShowAsync();
    }
    else
    {
        MessageDialog errorDialog = new Windows.UI.Popups.MessageDialog("输入错误!!!");
        await errorDialog.ShowAsync();
    }

需要注意的地方:

  • 根据自己注册和申请的接口修改对应的Url 和 AppKey
  • 使用UTF-8避免中文乱码
  • 使用JsonObject解析Json字符串内嵌的Json字符串,提取我们想要的信息
  • 使用XmlDocument 解析Xml字符串

总结

关于Json字符串和Xml字符串的解析,可以查看微软官方文档获取更加深入的理解 :JsonObject ClassXmlDocument Class

关于UWP网络编程,解析Json字符串和Xml字符串只是冰山一角,有空的话,将会补充其他一些关于网络编程的内容(才怪)

FYI

项目下载:JsonAndXmlSample

项目下载之后记住把Debug模式从ARM换成X86或X64(根据你自己的机型选择),之前一开始学习的时候不知道这一点,从网上下载下来的项目都运行不了,纠结的一逼(╥╯^╰╥)

补充

另一种更加简单的Json字符串解析方法:Newtonsoft.Json

( ̄ε(# ̄)☆╰╮o( ̄皿 ̄///)不早说

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值