c# 解析JSON的幾種辦法

來源:互聯網
上載者:User

標籤:des   style   http   color   java   使用   os   io   

欲成為海洋大師,必知曉海中每一滴水的真名。

剛開始只是想找一個轉換JSON數組的方法,結果在MSDN翻到一大把。

搜尋過程中免不了碰到一大堆名詞:WCF => DataContract => DataMember => DataContractJsonSerializer,然後就是不停的引入命名空間。

這一段經曆,立即讓我就聯想到了上面引用的這句存在於某小說裡面巫師的話語。靜態語言真有點令人抓狂,不停的做準備,然後才可能開始工作。

對比
.NET下幾種常見的解析JSON方法
主要類 命名空間 限制 內建LINQ支援
DataContractJsonSerializer System.Runtime.Serialization.Json 通用
JavaScriptSerializer System.Web.Script.Serialization 只能在Web環境使用
JsonArray、JsonObject、JsonValue System.Json 只能在Silverlight中使用
JsonConvert、JArray、JObject、JValue、JProperty Newtonsoft.Json 通用

 

準備資料

實體類:

    [DataContract]    public class Person    {        [DataMember(Order = 0, IsRequired = true)]        public string Name { get; set; }        [DataMember(Order = 1)]        public int Age { get; set; }        [DataMember(Order = 2)]        public bool Alive { get; set; }        [DataMember(Order = 3)]        public string[] FavoriteFilms { get; set; }        [DataMember(Order = 4)]        public Person Child { get; set; }    }

定義:

Action<object> log = o => Console.WriteLine(o);Func<int, int, int> add = (x, y) => x + y;var p1 = new Person {    Age = 12,    Alive = true,    Name = "lj",    FavoriteFilms = new[] { "Up", "Avatar" }};var p2 = new Person() { Age = 28, Name = "cy", Child = p1 };            
使用DataContractJsonSerializer

協助類:

  // using System.Runtime.Serialization.Json;        /// <summary>    /// 解析JSON,仿Javascript風格    /// </summary>    public static class JSON    {        public static T parse<T>(string jsonString)        {            using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))            {                return (T)new DataContractJsonSerializer(typeof(T)).ReadObject(ms);            }        }        public static string stringify(object jsonObject)        {            using (var ms = new MemoryStream())            {                new DataContractJsonSerializer(jsonObject.GetType()).WriteObject(ms, jsonObject);                return Encoding.UTF8.GetString(ms.ToArray());            }        }    }

用法:

    // 序列化    var jsonString = JSON.stringify(new[] { p1, p2 });    log(jsonString == JSON.stringify(new List<Person>() { p1, p2 }));   //true    log(jsonString);    // 還原序列化,泛型集合    JSON.parse<List<Person>>(jsonString);    // 數群組轉換                JSON.parse<Person[]>(jsonString);

輸出:

[{"Name":"lj","Age":12,"Alive":true,"FavoriteFilms":["Up","Avatar"],"Child":null},{"Name":"cy","Age":28,"Alive":false,"FavoriteFilms":null,"Child":{"Name":"lj","Age":12,"Alive":true,"FavoriteFilms":["Up","Avatar"],"Child":null}}]
使用JavaScriptSerializer
  // using System.Web.Script.Serialization;        var jser    = new JavaScriptSerializer();    var json    = jser.Serialize(new List<Person>() { p1, p2 });    var persons = jser.Deserialize<List<Person>>(json);
使用Silverlight
  // using System.Json        var css = "{ \"#header\" : {background:\"red\"}, layout : [5,4,1],color:\"cyan\" }";        var style = JsonObject.Parse(css) as JsonObject;            (    from s in style    where s.Key == "color"    select (string)s.Value    ).First().ToString();    // "cyan"            // 更多操作    style["layout"][0] = 22;        var hd = style["#header"];    style["body>div+p"] = hd;    style.Remove("#header");        var bd = new JsonObject();    bd["border"] = "1px solid cyan";    style["body>div+p"]["#meta"] = bd;    style.ToString();    // {"layout":[22,4,1],"color":"cyan","body>div+p":{"background":"red","#meta":{"border":"1px solid cyan"}}}
使用JSON.NET
  // using Newtonsoft.Json;        var json = JsonConvert.SerializeObject(new[] { p1, p2 });    var persons = JsonConvert.DeserializeObject<List<Person>>(json);    var ja = JArray.Parse(jsonString);                log(ja);//注意,格式化過的輸出

輸出:

[  {    "Name": "lj",    "Age": 12,    "Alive": true,    "FavoriteFilms": [      "Up",      "Avatar"    ],    "Child": null  },  {    "Name": "cy",    "Age": 28,    "Alive": false,    "FavoriteFilms": null,    "Child": {      "Name": "lj",      "Age": 12,      "Alive": true,      "FavoriteFilms": [        "Up",        "Avatar"      ],      "Child": null    }  }]

LINQ:

    var ageCount = ja.Select(j => (int)j["Age"]).Aggregate(add);        var q = from j in ja            where !j["Name"].Value<string>().Equals("lj")            select (int)j["Age"];        log(q.Aggregate(add) == ageCount);  //false

其他:

  // 與Linq to XML 相似的嵌套建構函式:    var jo = new JObject(                    new JProperty("age", persons.Select( p => p.Age)),                    new JProperty("funny", true),                    new JProperty("array", new JArray(new[] { 2, 4, 1 }))                    );    log(jo);        // JObject 操作    var css = "{ \"#header\" : {background:\"red\"}, layout : [5,4,1] }";    var style = JObject.Parse(css);    var bd = new JObject();    bd["color"] = "1px solid cyan";    style["border"] = bd;    var hd = style["#header"];    style["body>div+p"] = hd;    hd.Parent.Remove();    style["layout"][0] = 22;    log(style);

輸出:

    {      "age": [        12,        28      ],      "funny": true,      "array": [        2,        4,        1      ]    }    {      "layout": [        22,        4,        1      ],      "border": {        "color": "1px solid cyan"      },      "body>div+p": {        "background": "red"      }    }

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.