免费男女视频_国产系列 视频二区_羞羞视频免费入口网站_久国久产久精永久网页_国产免费观看av_一区二区三区日韩在线观看

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<intintint> 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" 
      } 
    } 
主站蜘蛛池模板: 欧美成人免费电影 | 哪里可以看免费的av | 成人毛片在线 | 91av亚洲| 久久一本日日摸夜夜添 | 91短视频网页版 | 成人电影毛片 | 羞羞视频2023| 欧美黄色一级片视频 | 亚洲精品久久久久www | 国产精品视频免费在线观看 | 毛片网站视频 | 免费一级毛片在线播放视频 | 免费视频观看 | 99欧美视频 | 视频一区二区久久 | 欧美精选一区二区 | 久久久涩 | 97青青| 欧美成人免费在线视频 | 高清视频91 | 精品中文视频 | 国产午夜精品视频免费不卡69堂 | av免费在线网| 日日狠狠久久 | 一级做受大片免费视频 | 成年人观看免费视频 | 久久免费视频8 | 欧美一级高潮片免费的 | 欧美综合在线观看 | 色诱亚洲精品久久久久久 | 欧美成人免费 | 九九热精彩视频 | 日韩精品二区 | 一级外国毛片 | 91短视频版高清在线观看免费 | 久久久久av电影 | 久久99国产精品久久99 | 国产精品成人av片免费看最爱 | 国产亚洲精品久久久久久网站 | 网站激情|