当前位置: 移动技术网 > IT编程>开发语言>.net > C#处理json实战

C#处理json实战

2019年02月19日  | 移动技术网IT编程  | 我要评论

太原公交,中华包装,老表你好嘢演员表

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

{

"data":

    {

        "people":

        [

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

        ]

    }

}

这里面,data就是一个对象,而people就是一个数组。
首先前往json官网下载对应的dll文件并应用。这里博主使用的是litjson。
首先分析天气查询返回来的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();

}

我的掘金:warrenryan

我的简书:warrenryan

欢迎关注我的博客获得第一时间更新

我的github:warrenryan

我的博客园:warrenryan

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网