• WP学习笔记(3)wp解析json


    接着上一篇,在上一篇里我们通过http请求获得了北京的天气预报,但是返回格式是json,在做web的时候肯定对json再熟悉不过了,今天就看看怎么在windows phone8里解析json。在wp里本身就集成了解析json的类System.Runtime.Serialization.Json.DataContractJsonSerializer。除此之外还可以用第三方开源类库json.net。下面是我在json.net的home上看到的(见文章最后备注),从这个数据来看无论是支持的功能还是序列化和反序列化的性能,都是json.net好,但是这个数据本身就是json.net提供的,不做评论。

    上次我们从http://www.weather.com.cn/data/cityinfo/101010100.html获取到的天气数据是这样的

    {"weatherinfo":{"city":"北京","cityid":"101010100","temp1":"27℃","temp2":"22℃","weather":"大雨转中雨","img1":"d9.gif","img2":"n8.gif","ptime":"11:00"}}

    我们先不管这些都是什么内容,只观察这个json的格式,创建的实体类应该是这样的

     1 public class WeatherModel
     2     {
     3         public WeatherInforDetails weatherinfo { get; set; }
     4         public class WeatherInforDetails
     5         {
     6             public string city { get; set; }
     7             public string cityid { get; set; }
     8             public string temp1 { get; set; }
     9             public string temp2 { get; set; }
    10             public string weather { get; set; }
    11             public string img1 { get; set; }
    12             public string img2 { get; set; }
    13             public string ptime { get; set; }
    14         }
    15     }

    再把上一篇里的请求扩展下,先看看用.net自带的DataContractJsonSerializer要怎么写

     1 HttpClient hc = new HttpClient();
     2 try
     3 {
     4    var task = await hc.GetAsync("http://www.weather.com.cn/data/cityinfo/101010100.html");
     5    string result = await task.Content.ReadAsStringAsync();
     6    using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(result)))
     7    {
     8        WeatherModel obj = Activator.CreateInstance<WeatherModel>();
     9        DataContractJsonSerializer js = new DataContractJsonSerializer(obj.GetType());
    10        WeatherModel model = (WeatherModel)js.ReadObject(ms);
    11        MessageBox.Show(model.weatherinfo.city); 
    12    }
    13                 
    14 }
    15 catch (Exception e)
    16 {
    17    MessageBox.Show(e.Message);
    18 }

    调试一下,已经可以出结果了。我们再看看用json.net应该怎么做,其他地方不用动,只要把上面try里的代码换一下就行

    在调整调整之前要先下载json.net的dll,可以从这里下载http://json.codeplex.com/,注意在wp项目中引用dll的时候要引用Portable40文件夹下的Newtonsoft.Json.dll

    WeatherModel model = (WeatherModel)JsonConvert.DeserializeObject(result, typeof(WeatherModel));
    MessageBox.Show(model.weatherinfo.city);

    调试一下也没问题,json.net稍微简洁了一点。看下面的对比表格,json.net支持linq to json,我们再看看如何用json.net的linq to json。

    JObject obj = JObject.Parse(result);
    JToken tok = obj["weatherinfo"];
    MessageBox.Show(tok["city"].ToString());

    居然还可以这么用,而且JObject还可以用foreach遍历,可以转换成array,list,collection等等。
    看到这突然灵光一线,对于这个json来说只是嵌套了一层,对于从另外一个更全的可以获得未来5天的天气api来说,返回的json简直就太复杂了,而且很多数据我们并用到,时不时可以用这样的写法简化一下model呢。我们再建一个model,WeatherModel1

     1 public class WeatherModel1
     2     {
     3         public string city { get; set; }
     4         public string cityid { get; set; }
     5         public string temp1 { get; set; }
     6         public string temp2 { get; set; }
     7         public string weather { get; set; }
     8         public string img1 { get; set; }
     9         public string img2 { get; set; }
    10         public string ptime { get; set; }
    11     }

    再把解析json的地方改成这样

    1  JObject obj = JObject.Parse(result);
    2 WeatherModel1 details = (WeatherModel1)JsonConvert.DeserializeObject(obj["weatherinfo"].ToString(), typeof(WeatherModel1));
    3 MessageBox.Show(details.city);

    是不是简单了不少,对于那些返回数据比较发杂的的json数据来说就太有用了。

    备注:

      Json.NET DataContractJsonSerializer JavaScriptSerializer
    Supports JSON      
    Supports BSON      
    Supports JSON Schema      
    Supports .NET 2.0      
    Supports .NET 3.5      
    Supports .NET 4.0      
    Supports .NET 4.5      
    Supports Silverlight      
    Supports Windows Phone      
    Supports Windows 8      
    Supports Portable Class Library      
    Open Source      
    MIT License      
    LINQ to JSON      
    Thread Safe      
    XPath-like JSON query syntax      
    Indented JSON support      
    Efficient dictionary serialization      
    Nonsensical dictionary serialization      
    Deserializes IList, IEnumerable, ICollection, IDictionary properties      
    Serializes circular references      
    Supports serializing objects by reference      
    Deserializes polymorphic properties and collections      
    Serializes and deserializes multidimensional arrays      
    Supports including type names with JSON      
    Globally customize serialization process      
    Supports excluding null values when serializing      
    Supports SerializationBinder      
    Conditional property serialization      
    Includes line number information in errors      
    Converts XML to JSON and JSON to XML      
    JSON Schema validation      
    JSON Schema generation from .NET types      
    Camel case JSON property names      
    Non-default constructors support      
    Serialization error handling      
    Supports populating an existing object      
    Efficiently serializes byte arrays as base64 text      
    Handles NaN, Infinity, -Infinity and undefined      
    Handles JavaScript constructors      
    Serializes .NET 4.0 dynamic objects      
    Serializes ISerializable objects      
    Supports serializing enums to their text name      
    JSON recursion limit support      
    Attribute property name customization      
    Attribute property order customization      
    Attribute property required customization      
    Supports ISO8601 dates      
    Supports JavaScript constructor dates      
    Supports Microsoft AJAX dates      
    Unquoted property names support      
    Raw JSON support      
    Supports reading and writing comments      
    Supports BigInteger      
    Serializes anonymous types      
    Deserializes anonymous types      
    Deserializes read only collections      
    Opt-in mode serialization      
    Opt-out mode serialization      
    Field (Serializable) mode serialization      
    Efficiently stream reading and writing JSON      
    Single or double quote JSON content      
    Supports overriding a type's serialization      
    Supports OnDeserialized, OnSerializing, OnSerialized and OnDeserializing attributes      
    Supports serializing private properties      
    DataMember attribute support      
    MetdataType attribute support      
    DefaultValue attribute support      
    Serializes DataSets and DataTables      
    Serailizes Entity Framework      
    Serializes nHibernate      
    Case-insensitive property deserialization      
    Tracing      

     

  • 相关阅读:
    USACO 2.3 和为零 (DFS)
    公牛和母牛 (Standard IO)
    【NOIP2016提高A组模拟10.15】算循环
    USACO 2.2 集合(DP)
    USACO 2.2 序言页码 (MATH)
    NET实现微信公共平台上传下载多媒体文件(转)
    asp.net 模拟CURL调用微信公共平台API 上传下载多媒体文
    LINQ to SQL语句
    JS时间(日期)比较或相减(暂时停用)
    json格式字符串处理
  • 原文地址:https://www.cnblogs.com/titans110/p/3180001.html
Copyright © 2020-2023  润新知