c#序列化json字符串及处理

上面提到的第四篇文章最后有个解析数组的例子,出现了 .First.First.First.First.Children(); 我表示很晕,网上找的的例子大多数是关于JObject的,但是我很少看到JArray的例子,其实解析json数组的时候是需要用到JArray的,复杂数据实际上是JObject和JArray的组合:{}对应的是JObject,而[]对应的是JArray。举个json的例子吧(数据来源是腾讯地图api的示例,解析的是北京某处的地理信息和周边信息,略长啊)

 

引用:  Newtonsoft.Json 

 

[javascript] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. {  
  2.     "status": 0,  
  3.     "message": "query ok",  
  4.     "result": {  
  5.         "address": "北京市海淀区彩和坊路海淀西大街74号",  
  6.         "address_component": {  
  7.             "province": "北京市",  
  8.             "city": "北京市",  
  9.             "district": "海淀区",  
  10.             "street": "彩和坊路",  
  11.             "street_number": "海淀西大街74号"  
  12.         },  
  13.         "pois": [  
  14.             {  
  15.                 "id": "3629720141162880123",  
  16.                 "title": "中国技术交易大厦",  
  17.                 "address": "北京市海淀区北四环西路66号",  
  18.                 "category": "房产小区;商务楼宇",  
  19.                 "location": {  
  20.                     "lat": "39.984122",  
  21.                     "lng": "116.307484"  
  22.                 },  
  23.                 "_distance": "3.6"  
  24.             },  
  25.             {  
  26.                 "id": "2845372667492951071",  
  27.                 "title": "中国技术交易大厦A座",  
  28.                 "address": "北京市海淀区北四环西路66号",  
  29.                 "category": "房产小区;商务楼宇",  
  30.                 "location": {  
  31.                     "lat": "39.984273",  
  32.                     "lng": "116.307577"  
  33.                 },  
  34.                 "_distance": "15.2"  
  35.             },  
  36.             {  
  37.                 "id": "12925244666643621769",  
  38.                 "title": "中国技术交易大厦B座",  
  39.                 "address": "北京市海淀区北四环西路66号",  
  40.                 "category": "房产小区;商务楼宇",  
  41.                 "location": {  
  42.                     "lat": "39.983902",  
  43.                     "lng": "116.307588"  
  44.                 },  
  45.                 "_distance": "29.3"  
  46.             },  
  47.             {  
  48.                 "id": "7472400256925846331",  
  49.                 "title": "中国化工博物馆",  
  50.                 "address": "海淀区北四环西路62号中国化工集团大厦3楼(海淀桥西)",  
  51.                 "category": "文化场馆;博物馆",  
  52.                 "location": {  
  53.                     "lat": "39.984582",  
  54.                     "lng": "116.308877"  
  55.                 },  
  56.                 "_distance": "127.5"  
  57.             },  
  58.             {  
  59.                 "id": "16243165360295251323",  
  60.                 "title": "贝塔咖啡",  
  61.                 "address": "北京市海淀区北四环西路66号中关村第三极大厦1层西北侧",  
  62.                 "category": "娱乐休闲;咖啡厅",  
  63.                 "location": {  
  64.                     "lat": "39.984391",  
  65.                     "lng": "116.307380"  
  66.                 },  
  67.                 "_distance": "28.0"  
  68.             },  
  69.             {  
  70.                 "id": "7246616758286733108",  
  71.                 "title": "基督教堂",  
  72.                 "address": "北京市海淀区彩和坊路9号",  
  73.                 "category": "旅游景点;教堂",  
  74.                 "location": {  
  75.                     "lat": "39.983146",  
  76.                     "lng": "116.307507"  
  77.                 },  
  78.                 "_distance": "112.2"  
  79.             },  
  80.             {  
  81.                 "id": "8627298709465036679",  
  82.                 "title": "北京三木和商店",  
  83.                 "address": "北京市海淀区北四环西路66号中关村文化商厦三层D-006-009单元",  
  84.                 "category": "购物;综合商场",  
  85.                 "location": {  
  86.                     "lat": "39.984093",  
  87.                     "lng": "116.307983"  
  88.                 },  
  89.                 "_distance": "42.6"  
  90.             },  
  91.             {  
  92.                 "id": "12020256857742021617",  
  93.                 "title": "图书城昊海楼",  
  94.                 "address": "北京市海淀区海淀西街36号",  
  95.                 "category": "房产小区;住宅区;住宅小区",  
  96.                 "location": {  
  97.                     "lat": "39.984400",  
  98.                     "lng": "116.306794"  
  99.                 },  
  100.                 "_distance": "65.4"  
  101.             },  
  102.             {  
  103.                 "id": "10394251724976454044",  
  104.                 "title": "北京点点酷东东商贸中心海淀分部",  
  105.                 "address": "北京市海淀区北四环西路66号中关村文化商厦2B001",  
  106.                 "category": "购物;综合商场",  
  107.                 "location": {  
  108.                     "lat": "39.984093",  
  109.                     "lng": "116.307983"  
  110.                 },  
  111.                 "_distance": "42.6"  
  112.             },  
  113.             {  
  114.                 "id": "16427755502147943355",  
  115.                 "title": "北京资源燕园宾馆",  
  116.                 "address": "北京市海淀区颐和园路1号",  
  117.                 "category": "酒店宾馆;星级酒店",  
  118.                 "location": {  
  119.                     "lat": "39.986712",  
  120.                     "lng": "116.305822"  
  121.                 },  
  122.                 "_distance": "318.3"  
  123.             }  
  124.         ]  
  125.     }  
  126. }  


我使用HttpRequest获取了这部分信息

 

 

[csharp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. HttpWebRequest request = (HttpWebRequest)result.AsyncState;  
  2. HttpWebResponse response = (HttpWebResponse)(request.EndGetResponse(result));  
  3. stream = response.GetResponseStream();  
  4. StreamReader reader = new StreamReader(stream, false);  
  5. string apiText = reader.ReadToEnd();  
  6. JObject jsonObj = null;  
  7. try  
  8. {  
  9.     jsonObj = JObject.Parse(apiText);  
  10.     if (jsonObj.Count == 1 || (int)(jsonObj["status"]) != 0) this.isError = true;  
  11.     else  
  12.     {  
  13.         string provinceName = (string)jsonObj["result"]["address_component"]["province"];  
  14.         string cityName = this.cityName_s = (string)jsonObj["result"]["address_component"]["city"];  
  15.         string districtName = (string)jsonObj["result"]["address_component"]["district"];  
  16.         string street = (string)jsonObj["result"]["address_component"]["street"];  
[csharp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1.         /*下面是解析JArray的部分*/  
  2.         JArray jlist = JArray.Parse(jsonObj["result"]["pois"].ToString()); //将pois部分视为一个JObject,JArray解析这个JObject的字符串  
  3.         LocationItem locationitem = null;      //存储附近的某个地点的信息  
  4.         locations = new List<LocationItem>();  //附近位置的列表  
  5.         for(int i = 0; i < jlist.Count ; ++i)  //遍历JArray  
  6.         {  
  7.             locationitem = new LocationItem();  
  8.             JObject tempo = JObject.Parse(jlist[i].ToString());  
  9.             locationitem.id = tempo["id"].ToString();  
  10.             locationitem.title = tempo["title"].ToString();  
  11.             locationitem._distance = tempo["_distance"].ToString();  
  12.             locationitem.address = tempo["address"].ToString();  
  13.             locationitem.category = tempo["category"].ToString();  
  14.             locationitem.location.lat = tempo["location"]["lat"].ToString();  
  15.             locationitem.location.lng = tempo["location"]["lng"].ToString();  
  16.             locations.Add(locationitem);  
  17.         }  
  18.     }  
  19. }  
  20. catch (Exception)  
  21. {  
  22.     isError = true;  
  23. }  

其中使用了两个类

 

 

[csharp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. public class LngLat  
  2.     {  
  3.         public string lat { get; set; }  
  4.         public string lng { get; set; }  
  5.     }  
  6.     public class LocationItem  
  7.     {  
  8.         public string id{get;set;} //  
  9.         public string title { get; set; } //名称  
  10.         public string address { get; set; } //地址  
  11.         public string category { get; set; } //类型  
  12.         public LngLat location { get; set; } //经纬度  
  13.         public string _distance { get; set; } //距离(米)  
  14.   
  15.         public LocationItem()  
  16.         {  
  17.             id = "0";  
  18.             title = "";  
  19.             address = "";  
  20.             _distance = "0";  
  21.             location = new LngLat { lng = "0", lat = "0" };  
  22.             category = "";  
  23.         }  
  24.     }  


这样就完成了这个复杂json数据的解析。JSON数组访问还有用数组下标方式的,那个就需要数组至少要有足够的个数,如要取得上面那个json数据的 中国技术大厦A座 ,就是用 jsonObj["result"]["pois"][1]["title"].ToString() ,即访问了result下pois数组的第2个节点的title信息,但是要遍历所有的数据就明显不如JArray方便了

posted @ 2016-07-04 15:55  gds111789  阅读(2091)  评论(0编辑  收藏  举报