安哥网络 发表于 2015-7-8 15:52:34

c# 解析JSON的几种办法

c# 解析JSON的几种办法
欲成为海洋大师,必知晓海中每一滴水的真名。刚开始只是想找一个转换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            通用            是      
    准备数据实体类:
        public class Person    {            public string Name { get; set; }            public int Age { get; set; }            public bool Alive { get; set; }            public string[] FavoriteFilms { get; set; }            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 : ,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"] = 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":,"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);//falseIT论坛:
// 与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 : }";    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"] = 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"      }    }几个链接:

[*]独立 JSON 序列化
[*]如何:对 JSON 数据进行序列化和反序列化
[*]Json.NET
[*]JSONLint
[*]BSON

http://www.cnblogs.com/ambar/archive/2010/07/13/parse-json-via-csharp.html
c# 解析JSON的几种办法

页: [1]
查看完整版本: c# 解析JSON的几种办法