Asp.net Json数据解析的一种思路
在日常的编码中,经常会遇到JSON类型的数据,有简单的,也有复杂的。对于简单的,我们可以用正则等匹配,但是一旦遇到复杂的,就比较难办了。
数据分析
目前手头上需要制作一个天气预报功能,现成的接口已经有了。我随便输入一个城市,然后出现了如下的信息:
{"wdata":{"cityName":"鹤壁",
"location":{"lat":"35.62",
"lng":"114.18"},
"today":"2013-9-12 10:30:00",
"sevDays":[{"date":"2013-9-12 20:00:00","Tmax":"28","weatherID":"02转01","windDir":"0","windPower":"0","Tmin":"18"},
{"date":"2013-9-13 20:00:00","Tmax":"33","weatherID":"00","windDir":"0","windPower":"0","Tmin":"18"},
{"date":"2013-9-14 20:00:00","Tmax":"35","weatherID":"00","windDir":"0","windPower":"0","Tmin":"19"},
{"date":"2013-9-15 20:00:00","Tmax":"27","weatherID":"01","windDir":"0","windPower":"0","Tmin":"16"},
{"date":"2013-9-16 20:00:00","Tmax":"25","weatherID":"01","windDir":"0","windPower":"0","Tmin":"17"},
{"date":"2013-9-17 20:00:00","Tmax":"26","weatherID":"02","windDir":"0","windPower":"0","Tmin":"18"},
{"date":"2013-9-18 20:00:00","Tmax":"27","weatherID":"02转07","windDir":"0","windPower":"0","Tmin":"16"}],
"zhishu":[{"value":"2","name":"CY"},
{"value":"0","name":"ZS"},
{"value":"8","name":"FH"},
{"value":"2","name":"ZWX"},
{"value":"4","name":"KQWR"},
{"value":"2","name":"LY"},
{"value":"1","name":"JT"},
{"value":"1","name":"GM"},
{"value":"1","name":"SSD"}],
"currentMessage":{"reportTime":"2013-9-12 13:00:00",
"weatherID":"02",
"temperature":"27",
"windDir":"4",
"windPower":"0",
"humidity":"69.0",
"visibility":"8",
"pressure":"1012.2",
"sunrise":"6:01",
"sunset":"18:38"}
}
}
这段JSON数据结构比一般的要复杂那么一点,不过从其结构来看:
第一层应该是wdata。
第二层是cityName(城市名称),location(经纬度),today(当前时间),sevDays(后续天气),zhishu(指数),currentMessage(当前预报信息)。
第三层是:location下面的lat,lng;sevDays下面的date,Tmax,weatherID,windDir,windPower,Tmin; 然后是zhishu下面的value 和 name;最后是currentMessage下面的reportTime,weatherID,temperature,windDir,windPower,humidity,visibility,pressure,sunrise,sunset信息:
所以,总共说来,这个JSON数据总共就三层。
解析方式
那么,如何来解析呢?
其实,我们完全可以从最底层的结构分析起来,然后简历相关的类,最后把这些建立的类组合成类似json数据的结构就可以了。
这里,最底层就是第三层,我们开始建立起相关的类对象:
对于sevDays下的项目, 建立如下类:
using System; namespace Nxt.Common.Weather
{
public class DateReleation
{
//sevDays
public DateTime date { get; set; }
public int Tmax { get; set; }
public string weatherID { get; set; }
public int windDir { get; set; }
public int windPower { get; set; }
public int Tmin { get; set; }
}
}
对于zhishu下的项目,建立的类如下:
namespace Nxt.Common.Weather
{
public class IndexPoint
{
//zhishu
public int value { get; set; }
public string name { get; set; }
}
}
对于currentMessage下的项目,建立的类如下:
using System; namespace Nxt.Common.Weather
{
public class CurrentMessage
{
//currentMessage
public DateTime reportTime { get; set; }
public string weatherID {get;set;}
public double temperature { get; set; }
public string windDir { get; set; }
public string windPower { get; set; }
public double humidity { get; set; }
public string visibility { get; set; }
public double pressure { get; set; }
public string sunrise { get; set; }
public string sunset { get; set; }
}
}
对于location下面的项目,建立的类如下:
namespace Nxt.Common.Weather
{
public class Location
{
//location
public string lat { get; set; }
public string lng { get; set; }
}
}
当第三层的都建立完毕后,现在来建立第二层,第二层的对象如上面所述,但是需要注意的是,sevDays,zhishu都是可以有多条记录的 ,所以我们得用List对象来保存。
using System;
using System.Collections.Generic; namespace Nxt.Common.Weather
{
public class WeatherMain
{
//wdata
public string cityName { get; set; }
public Location location { get; set; }
public DateTime today { get; set; }
public List<DateReleation> sevDays { get; set; }
public List<IndexPoint> zhishu { get; set; }
public CurrentMessage currentMessage { get; set; } public WeatherMain()
{
sevDays = new List<DateReleation>();
zhishu = new List<IndexPoint>();
}
}
}
上面的代码是依据JSON数据的结构而建立的,这样能够最大程度避免数据的不准确性。
最后,建立顶层的类:
namespace Nxt.Common.Weather
{
public class Daemon
{
public WeatherMain wdata { get; set; }
}
}
这样,我们的类结构就建立完毕了。
最后审查一下我们建立的类结构,是不是和JSON数据的组织结构是一样的呢?
如果是一样的,让我们进入下一步:
using System;
using System.IO;
using System.Net;
using System.Web.Script.Serialization;
using Nxt.Common.Weather;
using System.Text; namespace Nxt.Web.Code
{
public class WeatherDaemon
{
public Daemon GetWeather(string areaName)
{
string url = "http://weather.****.net/Weather/getWeather.php?area=" + areaName;
WebRequest request = WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream dataStream = response.GetResponseStream(); string weatherData = string.Empty;
if (dataStream != null)
{
try
{
using (StreamReader reader = new StreamReader(dataStream, Encoding.UTF8))
{
weatherData = reader.ReadToEnd();
}
}
catch (OutOfMemoryException oe)
{
throw new Exception(oe.Data.ToString());
}
catch (IOException ie)
{
throw new Exception(ie.Data.ToString());
}
} if (!String.IsNullOrEmpty(weatherData))
{
JavaScriptSerializer ser = new JavaScriptSerializer();
Daemon main = ser.Deserialize<Daemon>(weatherData);
return main;
}
return null;
}
}
}
请注意图中黄色部分,(使用JavaScriptSerializer,我们需要引用System.web.extensions.)
最后看看结果,我们是不是得到了想要的数据呢?
Asp.net Json数据解析的一种思路的更多相关文章
- Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示
Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示 今天项目中要实现一个天气的预览,加载的信息很多,字段也很多,所以理清了一下思路,准备独立出来写一个总结,这样对大家 ...
- IOS - JSON数据解析 小3种方法
[manager GET:serverURL parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject ...
- [转]JSon数据解析的四种方式
转至http://blog.csdn.net/enuola/article/details/7903632 作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的js ...
- JSON数据解析 基础知识及链接收集
JSON数据解析学习 JSON介绍 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式. JSON 是存储和交换文本信息的语法.类似 XML.但是JSON 比 ...
- 浅谈JSON数据解析方法
JSON数据解析 JSON是什么?? 如何把JSON数据解析出来 如何把一个字典转换为JSON JSON详细介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交 ...
- JSON数据解析(转)
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. 本文将主要介绍在Android ...
- JSON数据解析(GSON方式) (转)
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. 在上一篇博文<Andro ...
- iOS - JSON 数据解析
iOS - JSON 数据解析 前言 NS_CLASS_AVAILABLE(10_7, 5_0) @interface NSJSONSerialization : NSObject @availab ...
- Silverlight项目笔记7:xml/json数据解析、TreeView、引用类型与数据绑定错误、图片加载、虚拟目录设置、silverlight安全机制引发的问题、WebClient缓存问题
1.xml/json数据解析 (1)xml数据解析 使用WebClient获取数据,获取到的数据实例化为一个XDocument,使用XDocument的Descendants(XName)方法获得对应 ...
随机推荐
- 深入理解java虚拟机(2)------垃圾收集器和内存分配策略
GC可谓是java相较于C++语言,最大的不同点之一. 1.GC回收什么? 上一篇讲了内存的分布. 其中程序计数器栈,虚拟机栈,本地方法栈 3个区域随着线程而生,随着线程而死.这些栈的内存,可以理解为 ...
- Centos 源配置 163,epel,mysql
http://mirrors.163.com/.help/centos.html CentOS7-Base-163.repo # CentOS-Base.repo # # The mirror sys ...
- Spring-2-H Array Diversity(SPOJ AMR11H)解题报告及测试数据
Array Diversity Time Limit:404MS Memory Limit:0KB 64bit IO Format:%lld & %llu Descript ...
- 《HTML5与CSS3实例教程》
<HTML5与CSS3实例教程> 基本信息 作者: (美)Brian P. Hogan 译者: 卢俊祥 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:97871153634 ...
- 大数据公益课堂成就你高薪之梦,30W,50W,100W...
从之前的知道“大数据”这词,到2013年正式开始了解大数据领域,再到2014年深入研究大数据相关的领域,到现在逐渐影响周围的同学.朋友和家人.大数据技术将给我们带来的远不止我们想到的这些.曾经我身边的 ...
- C++基础——子类转父类转子类 (派生类转基类转派生类)
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- 设计模式C#实现(九)——工厂方法模式和简单工厂
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. 构成: 1.Product工厂方法创建的对象的接口 2.Concrete ...
- FZU 1608 Huge Mission(线段树)
Problem 1608 Huge Mission Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description Oaiei ...
- repcached的安装练习
1 自行寻找一个具有大量非结构化数据,很难使用关系型数据库进行处理的场景,清晰描述场景并指出困难所在,要求原创 譬如说:以易迅电商为例,顾客会对购买的商品做出反馈评论,这些评论都是非结构化的数据,如 ...
- μc/osⅡ简化版任务机制浅析
去年玩过一阵单片机,也用过μc/osⅡ的系统,但是就理解内核而言,整个即时操作系统还是过于冗杂,很多的东西很不适合初学者来动手操作,多方查找我发现他的任务机制可以进行功能的进一步简化, 可以类似于任务 ...