• 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[] { 241 })) 
                        ); 
        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" 
          } 
        } 
  • 相关阅读:
    C语言的存储类别和动态内存分配
    C语言中复杂的声明
    C语言中typedef的解释_2
    C语言中类型限定符
    C语言文件I/O和标准I/O函数
    C语言中存储类别、链接与内存管理
    C++中static与const成员
    C++多态、虚函数、纯虚函数、抽象类
    sizeof结构体
    杂类
  • 原文地址:https://www.cnblogs.com/topcoder/p/2984839.html
Copyright © 2020-2023  润新知