四联光电智能照明论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2519|回复: 3
打印 上一主题 下一主题

常见的解析JSON方法

[复制链接]
  • TA的每日心情
    开心
    2018-7-4 09:08
  • 97

    主题

    392

    帖子

    6095

    积分

    论坛元老

    Rank: 8Rank: 8

    积分
    6095
    跳转到指定楼层
    楼主
    发表于 2016-10-27 16:23:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    对比.NET下几种常见的解析JSON方法[td]
    主要类命名空间限制内建LINQ支持
    DataContractJsonSerializerSystem.Runtime.Serialization.Json通用
    JavaScriptSerializerSystem.Web.Script.Serialization只能在Web环境使用
    JsonArrayJsonObjectJsonValueSystem.Json只能在Silverlight中使用
    JsonConvertJArrayJObjectJValueJPropertyNewtonsoft.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"
          }
        }
  • TA的每日心情
    开心
    2018-12-28 16:25
  • 817

    主题

    1556

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    14941
    沙发
    发表于 2016-10-27 16:32:31 | 只看该作者
  • TA的每日心情
    开心
    2018-12-28 16:25
  • 817

    主题

    1556

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    14941
    板凳
    发表于 2016-10-27 16:47:18 | 只看该作者
  • TA的每日心情
    开心
    2018-12-28 16:25
  • 817

    主题

    1556

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    14941
    地板
    发表于 2016-10-27 20:47:34 | 只看该作者
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Silian Lighting+ ( 蜀ICP备14004521号-1 )

    GMT+8, 2024-4-28 23:46 , Processed in 1.125000 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表