c# 解析JSON的幾種辦法


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

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

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

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

對比

.NET下幾種常見的解析JSON方法
主要類 命名空間 限制 內建LINQ支持
DataContractJsonSerializer System.Runtime.Serialization.Json 通用
JavaScriptSerializer System.Web.Script.Serialization 只能在Web環境使用
JsonArrayJsonObjectJsonValue System.Json 只能在Silverlight中使用
JsonConvertJArrayJObjectJValueJProperty 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" } } 

幾個鏈接:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM