转载--文章(感谢陈晨博主分享) 关于 Json.net

本文出自地址: http://www.cnblogs.com/freshman0216/p/4161800.html#undefined

Newtonsoft.Json,一款.NET中开源的Json序列化和反序列化类库(下载地址http://json.codeplex.com/)。

下面是Json序列化和反序列化的简单封装:

    /// <summary>
    /// Json帮助类
    /// </summary>
    public class JsonHelper
    {
        /// <summary>
        /// 将对象序列化为JSON格式
        /// </summary>
        /// <param name="o">对象</param>
        /// <returns>json字符串</returns>
        public static string SerializeObject(object o)
        {
            string json = JsonConvert.SerializeObject(o);
            return json;
        }

        /// <summary>
        /// 解析JSON字符串生成对象实体
        /// </summary>
        /// <typeparam name="T">对象类型</typeparam>
        /// <param name="json">json字符串(eg.{"ID":"112","Name":"石子儿"})</param>
        /// <returns>对象实体</returns>
        public static T DeserializeJsonToObject<T>(string json) where T : class
        {
            JsonSerializer serializer = new JsonSerializer();
            StringReader sr = new StringReader(json);
            object o = serializer.Deserialize(new JsonTextReader(sr), typeof(T));
            T t = o as T;
            return t;
        }

        /// <summary>
        /// 解析JSON数组生成对象实体集合
        /// </summary>
        /// <typeparam name="T">对象类型</typeparam>
        /// <param name="json">json数组字符串(eg.[{"ID":"112","Name":"石子儿"}])</param>
        /// <returns>对象实体集合</returns>
        public static List<T> DeserializeJsonToList<T>(string json) where T : class
        {
            JsonSerializer serializer = new JsonSerializer();
            StringReader sr = new StringReader(json);
            object o = serializer.Deserialize(new JsonTextReader(sr), typeof(List<T>));
            List<T> list = o as List<T>;
            return list;
        }

        /// <summary>
        /// 反序列化JSON到给定的匿名对象.
        /// </summary>
        /// <typeparam name="T">匿名对象类型</typeparam>
        /// <param name="json">json字符串</param>
        /// <param name="anonymousTypeObject">匿名对象</param>
        /// <returns>匿名对象</returns>
        public static T DeserializeAnonymousType<T>(string json, T anonymousTypeObject)
        {
            T t = JsonConvert.DeserializeAnonymousType(json, anonymousTypeObject);
            return t;
        }
    }

为进一步理解Newtonsoft,写了一些测试的例子:

    /// <summary>
    /// Json测试
    /// </summary>
    public class JsonTest : IRun
    {
        public void Run()
        {
            Student sdudent = new Student();
            sdudent.ID = 1;
            sdudent.Name = "陈晨";
            sdudent.NickName = "石子儿";
            sdudent.Class = new Class() { Name = "CS0216", ID = 0216 };

            //实体序列化和反序列化
            string json1 = JsonHelper.SerializeObject(sdudent);
            //json1 : {"ID":1,"Name":"陈晨","NickName":"石子儿","Class":{"ID":216,"Name":"CS0216"}}
            Student sdudent1 = JsonHelper.DeserializeJsonToObject<Student>(json1);

            //实体集合序列化和反序列化
            List<Student> sdudentList = new List<Student>() { sdudent, sdudent1 };
            string json2 = JsonHelper.SerializeObject(sdudentList);
            //json: [{"ID":1,"Name":"陈晨","NickName":"石子儿","Class":{"ID":216,"Name":"CS0216"}},{"ID":1,"Name":"陈晨","NickName":"石子儿","Class":{"ID":216,"Name":"CS0216"}}]
            List<Student> sdudentList2 = JsonHelper.DeserializeJsonToList<Student>(json2);

            //DataTable序列化和反序列化
            DataTable dt = new DataTable();
            dt.TableName = "Student";
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("Name");
            dt.Columns.Add("NickName");
            DataRow dr = dt.NewRow();
            dr["ID"] = 112;
            dr["Name"] = "战三";
            dr["NickName"] = "小三";
            dt.Rows.Add(dr);
            string json3 = JsonHelper.SerializeObject(dt);
            //json3 : [{"ID":112,"Name":"战三","NickName":"小三"}]
            DataTable sdudentDt3 = JsonHelper.DeserializeJsonToObject<DataTable>(json3);
            List<Student> sdudentList3 = JsonHelper.DeserializeJsonToList<Student>(json3);

            //验证对象和数组
            Student sdudent4 = JsonHelper.DeserializeJsonToObject<Student>("{\"ID\":\"112\",\"Name\":\"石子儿\"}");
            List<Student> sdudentList4 = JsonHelper.DeserializeJsonToList<Student>("[{\"ID\":\"112\",\"Name\":\"石子儿\"}]");

            //匿名对象解析
            var tempEntity = new { ID = 0, Name = string.Empty };
            string json5 = JsonHelper.SerializeObject(tempEntity);
            //json5 : {"ID":0,"Name":""}
            tempEntity = JsonHelper.DeserializeAnonymousType("{\"ID\":\"112\",\"Name\":\"石子儿\"}", tempEntity);
            var tempStudent = new Student();
            tempStudent = JsonHelper.DeserializeAnonymousType("{\"ID\":\"112\",\"Name\":\"石子儿\"}", tempStudent);

            Console.Read();
        }

    }

    /// <summary>
    /// 学生信息实体
    /// </summary>
    public class Student
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string NickName { get; set; }
        public Class Class { get; set; }
    }

    /// <summary>
    /// 学生班级实体
    /// </summary>
    public class Class
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }

使用Json帮助类时,有两点需要注意下:

1. 通常使用调用实体序列化SerializeObject()和反序列化DeserializeJsonToObject()两个方法就可以了。但有些情况下我们解析json字符串时,可能没有对应的实体类型(或者说不想添加对应的实体类),这时候可以用匿名对象解析方法DeserializeAnonymousType(),方便快捷,对应代码如下:

            //匿名对象解析
            var tempEntity = new { ID = 0, Name = string.Empty };
            string json5 = JsonHelper.SerializeObject(tempEntity);
            //json5 : {"ID":0,"Name":""}
            tempEntity = JsonHelper.DeserializeAnonymousType("{\"ID\":\"112\",\"Name\":\"石子儿\"}", tempEntity);
            Console.WriteLine(tempEntity.ID + ":" + tempEntity.Name);

2. Json的两种结构数组和对象解析时略有不同。Json对象一般转换成实体,Json数组一般转换成实体集合。代码如下:

            //验证对象和数组
            Student sdudent4 = JsonHelper.DeserializeJsonToObject<Student>("{\"ID\":\"112\",\"Name\":\"石子儿\"}");
            List<Student> sdudentList4 = JsonHelper.DeserializeJsonToList<Student>("[{\"ID\":\"112\",\"Name\":\"石子儿\"}]");

简单解释下Json对象和数组的含义:

对象是以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间运用 “,”(逗号)分隔。名称用引号括起来;值如果是字符串则必须用括号,数值型则不须要。例如:{"ID":"112","Name":"石子儿"}。

数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间运用 “,”(逗号)分隔。例如:[{"ID":"112","Name":"石子儿"},{"ID":"113","Name":"陈晨"}]。\

本文出自地址: http://www.cnblogs.com/freshman0216/p/4161800.html#undefined

时间: 2024-08-26 05:43:30

转载--文章(感谢陈晨博主分享) 关于 Json.net的相关文章

转载--文章(感谢米粒儿博主分享) 关于 Json.net序列化时间问题

http://www.cnblogs.com/lxsweat/p/4372508.html 上代码 其中的使用方法和UserInfo实体对象就不贴代码了. /// <summary> /// 把对象转成json字符串 /// </summary> /// <param name="o">对象</param> /// <returns>json字符串</returns> public static string Se

CSS常用标签-手打抄录-感谢原未知博主-拜谢了

CSS常用标签 CSS常用标签 一 CSS文字属性 color : #999999; /*文字颜色*/ font-family : 宋体,sans-serif; /*文字字体*/ font-size : 9pt; /*文字大小*/ font-style:itelic; /*文字斜体*/ font-variant:small-caps; /*小字体*/ letter-spacing : 1pt; /*字间距离*/ line-height : 200%; /*设置行高*/ font-weight:b

博主自己的博客样式分享

#下载 ??Github:源码下载 #声明 ??1. 本站模仿[夏日浅笑.]博主的博客样式,再此基础上进行二次加工,因为该博主分享出来的源码我使用时出来挺多问题. ??2. 本分享提供给懒于设置样式的人和新入门的小白. ??3. 如果使用该样式请说明出处 #使用方式 打开 博客设置,将博客皮肤设置为BlueSky,并申请JS代码支持 一般来说,快的话1小时,慢的话最晚一天 下载源码 将修改好的源码,复制到后台中,3个文件对应. #修改源码 ??列出需要修改的地方 ??1.所有a标签以及页面描述改

程序员常用不常见很难得的地址大全,博主很辛苦

网址分类导航:       简单设置与开发支持       桌面程序可能用的到        美工可能会看的         前端人员可能用的       简单工具         常用软件下载           数据库工具        游戏开发          其他语言友情链接        jQuery框架       .NET要用到的部分解决方案框架       程序员的网站       稍微偏放松点      IT方面最新的科技新闻      IT培训课程系列的网站    程序员找

【转载】利用新浪博客建设网站外链

当今网络管理机制越来越完善,允许发外接的网站越来越少,建设网站外链变得越来越困难,今天和大家分享一篇文章,告诉你如何利用新浪博客建设网站外键. 目前国内知名的博客平台有QQ.网易.新浪.搜狐.百度等,先来分析一下为什么我为什么选择新浪博客建设网站外链? 腾讯博客(QQ空间)是不被搜索引擎收录的,所以直接淘汰. 网易博客使用的是三级域名,即使成功建设外链权重也不高. 百度博客(百度HI)即将要关闭了,完全是浪费时间. 搜狐博客也是使用三级域名,权重并不高. 新浪博客的内容页使用 blog.sina

博主个人介绍chrome-live-writer

博主个人介绍 1   联系方式 姓名:Harmo(哈莫) Email:[email protected] QQ:1295351490 2   个人信息 哈莫/男/198* 本科:WHU 研究生:WHU 工作年限:3年 技术博客:http://www.cnblogs.com/beer Github:http://github.com/zhengwh 个人职业技能及规划 软件测试开发 测试系统开发 软件质量保证 开发流程规范 工作和生活城市:武汉 3   技能清单 3.1   英语技能 求学阶段通过

致全体51CTO博主:洛阳亲友如相问,就说你在手机里

各位51CTO的博主们,在近期我们优化了博客的H5移动站,可以支持在手机上便捷浏览博客主页.博文页面,还可以支持用户在文章下面评论互动.移动时代,我们的博客也加快了移动化的步伐,"洛阳亲友如相问",就说你在手机里. 具体说明如下: 一.你的博客主页在手机里 进入路径:手机浏览器输入自己的博客主页地址,自动进入手机适配模式,如下: 二.你的博文在手机里 进入路径:在文章页下方-分享-微信图标,点击弹出二维码,使用微信扫一扫,进入博文页手机版,样式如下:  三.你的评论互动在手机里 进入路

Android 新浪博客分享问题总结

 分类: android(33)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 我遇到BUG 1    sso package or singn error Bug2 SSO 登陆授权   代码进不到 类 AuthListener 的onComplete方法 BUG3 没有添加权限 BUG 4  回调地址不同 微博开发遇到很多bug 总结一下 我遇到BUG (1)    :sso package or singn error 出现这个问题  是我没有在 博客中填写正确

博主的缺点

每年年底更新一次,监督自己,警示自己: 意志薄弱,做事情没有毅力,容易逃避问题,面对困难容易放弃和迂回的退缩: 受不了委屈,遇到自己不顺意,讲自己的不对的地方,自己就会习惯性的反抗,不能够冷静下来,容易激动: 书读得太少,家族穷得太久,没有读书人,没有修养,眼见和见识都太少,应该多尝试,多接触事情,改变自己不会说话,不会圆话,生活没有哲学,不知社会的黑暗的一面: 太把自己当回事,什么事情都是以自我为中心,把自己看得太重要: 太贪:"不是自己的东西不要拿,是自己的东西一定要珍惜,一定要做好&quo