使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)

在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合、字典、动态对象和匿名对象),在这篇文章中我将通过JToken、JObject和JArray来动态解析JSON对象,使它很容易创建和检索的JSON内容而无需基础类型。通过JObject和JArray创建JSON对象我们先用非常简单的方法来动态创建一些JSON,可通过JToken派生的JSON.NET对象来进行,最常见的JToken派生的类是JObject和JArray。
因为JToken实现了IDynamicMetaProvider动态语言接口,所以可以使用dynamic关键字直观地创建动态对象,并把这个动态对象序列化为JSON字符串。

Newtonsoft.Json的地址:

官网:http://json.codeplex.com/

源码地址:https://github.com/JamesNK/Newtonsoft.Json

Newtonsoft.Json.dll下载:https://github.com/JamesNK/Newtonsoft.Json/releases

例子1、
通过JArray和JObject来创建一个音乐专辑结构的一个示例:

            //Newtonsoft.Json.Linq.JObject jsonObject = new Newtonsoft.Json.Linq.JObject {{"Entered", DateTime.Now}};

            Newtonsoft.Json.Linq.JObject jsonObject = new Newtonsoft.Json.Linq.JObject();

            jsonObject.Add("Entered", DateTime.Now);

            dynamic album = jsonObject;

            album.AlbumName = "Dirty Deeds Done Dirt Cheap";
            album.Artist = "AC/DC/DVD";
            album.YearReleased = DateTime.Now.Year;

            album.Songs = new Newtonsoft.Json.Linq.JArray() as dynamic;

            dynamic song = new Newtonsoft.Json.Linq.JObject();
            song.SongName = "Dirty Deeds Done Dirt Cheap";
            song.SongLength = "4:05";
            album.Songs.Add(song);

            song = new Newtonsoft.Json.Linq.JObject();
            song.SongName = "Love at First Feel";
            song.SongLength = "3:01";
            album.Songs.Add(song);

            song = new Newtonsoft.Json.Linq.JObject();
            song.SongName = "小苹果";
            song.SongLength = "03:32";
            album.Songs.Add(song);

            Console.WriteLine(album.ToString());

            Console.ReadLine();

以上代码最重要的是没有明确指定类型,便可将动态对象进行JSON序列化,而JObject对象只是接收数据,具体结构通过动态语言在运行时生成,这意味着此代码可以在运行时被编译,从而体现动态语言的优势。序列化的结果如下图所示:

例子2、

            //Newtonsoft.Json.Linq.JObject jsonObject = new Newtonsoft.Json.Linq.JObject {{"Entered", DateTime.Now}};
            Newtonsoft.Json.Linq.JObject jsonObject = new Newtonsoft.Json.Linq.JObject();
            jsonObject.Add("Entered", DateTime.Now);
            dynamic album = jsonObject;

            album.AlbumName = "非主流歌曲";

            foreach (var item in jsonObject)  //循环输出动态的值  JObject(基类为JContainer、JObject和JArray)是一个集合,实现了IEnumerable接口,因此你还可以轻松地在运行时循环访问
            {
                Console.WriteLine(item.Key + "的值为:" + item.Value.ToString());
            }

执行结果为:

例子3:

JObject.Parse()和JArray.Parse()方法导入JSON格式,JToken结构支持Parse()和Load()方法,这两个方法可以分别从字符串或各种流读取JSON数据。JValue包括最核心的JSON 解析能力,支持将字符串转化为我们熟悉的动态对象。将JSON字符串转换为成JObject对象,并强制转换为动态类型。

            var jsonString = @"{""Name"":""小苹果"",""Company"":""韩国公司"",   ""Entered"":""2016-11-26 00:14""}";

            dynamic json = Newtonsoft.Json.Linq.JToken.Parse(jsonString) as dynamic; 

            string name = json.Name;
            string company = json.Company;
            DateTime entered = json.Entered;
            Console.WriteLine("name:"+name);
            Console.WriteLine("company:" + company);
            Console.WriteLine("entered:" + entered);

执行结果:

例子4:

将JObject和JArray实例映射到一个强类型的对象,所以你可以在同一段代码中混合书写动态和静态类型

            string jsonString1 = @"[{""Name"":""小苹果"",""Age"":""20""},{""Name"":""演员"",""Age"":""2""}]";
            Newtonsoft.Json.Linq.JArray userAarray1 = Newtonsoft.Json.Linq.JArray.Parse(jsonString1) as Newtonsoft.Json.Linq.JArray;
            List<User> userListModel = userAarray1.ToObject<List<User>>();
            foreach (var userModel1 in userListModel)
            {
                Console.WriteLine("Name:" + userModel1.Name);
                Console.WriteLine("Age:" + userModel1.Age);
            }

            Console.WriteLine("");
            string jsonString = @"[{""Name"":""小苹果"",""Age"":""20""}]";
            Newtonsoft.Json.Linq.JArray userAarray = Newtonsoft.Json.Linq.JArray.Parse(jsonString) as Newtonsoft.Json.Linq.JArray;
            Newtonsoft.Json.Linq.JObject jObject = userAarray[0] as Newtonsoft.Json.Linq.JObject;
            User userModel = jObject.ToObject<User>();
            Console.WriteLine("Name:" + userModel.Name);
            Console.WriteLine("Age:" + userModel.Age);
    public class User
    {
        public string Name { set; get; }
        public int Age { set; get; }
    }

执行结果:

例子5、

JSON.NET对动态语言的支持,但也别忘了它对静态类型的强大支持,关于如何序列化和反序列化强类型对象,JsonConvert是一个高级别的静态类,包装更低级别的功能,但你也可以使用JsonSerializer类,该类可以序列化和反序列化各种流

            UserType album = new UserType()
            {
                Type = "普通用户",
                UserListModel = new List<User>()
                {
                    new User()
                    {
                        Name="张三",
                        Age = 20
                    },
                    new User()
                    {
                        Name="李四",
                        Age = 30
                    }
                }
            };

            // serialize to string
            string json2 = Newtonsoft.Json.JsonConvert.SerializeObject(album, Newtonsoft.Json.Formatting.Indented);
            Console.WriteLine("序列化结果");
            Console.WriteLine("");
            Console.WriteLine(json2);

            UserType userType = Newtonsoft.Json.JsonConvert.DeserializeObject<UserType>(json2);
            Console.WriteLine("");
            Console.WriteLine("反序列化:");
            Console.WriteLine("Type:"+ userType.Type);
            Console.WriteLine("");
            foreach (var userModel in userType.UserListModel)
            {
                Console.WriteLine("Name:"+userModel.Name);
                Console.WriteLine("Age:" + userModel.Age);
            }
    public class UserType
    {
        public string Type { get; set; }
        public List<User> UserListModel { get; set; }
    }

    public class User
    {
        public string Name { set; get; }
        public int Age { set; get; }
    }

执行结果:

时间: 2024-11-27 17:16:04

使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)的相关文章

JSON的简单使用_解析前台传来的JSON数据

1 package cn.rocker.json; 2 3 import org.junit.Test; 4 5 import net.sf.json.JSONArray; 6 import net.sf.json.JSONObject; 7 8 /** 9 * @ClassName: parseJsonFromFront 10 * @Description: 解析前台传来的JSON 11 * @author 112 12 * @date 2018年3月28日 上午10:47:01 13 */

Python 解析模块 异常模块 响应模块 序列化和反序列化组件

解析模块(后端根据指定的解析规则来解析前端发来的数据) 为什么要配置解析模块 1)drf给我们通过了多种解析数据包方式的解析类 2)我们可以通过配置来控制前台提交的哪些格式的数据后台在解析,哪些数据不解析 3)全局配置就是针对每一个视图类,局部配置就是针对指定的视图来,让它们可以按照配置规则选择性解析数据 源码入口 # APIView类的dispatch方法中 request = self.initialize_request(request, *args, **kwargs) # 点进去 #

C#JSON序列化与反序列化

原文:C#JSON序列化与反序列化 windows phone学习也有一段时间了,想要做一个新闻客户端练练手,于是就在网上找看有没有接口之类.在天狗播客找到了热点热词新闻资讯API开放接口,接口提供的是JSON格式的数据,由于之前没用过JSON,于是就在网上各种查.技术讨论群上各种问...... 废话不多说了,下面把我收获分享出来.望像我一样的小白少走弯路. 一个实体类 public class NewsModel { public string Title { get; set; } publ

Swifter.Json 可能是 .Net 平台迄今为止性能最佳的 Json 序列化库【开源】

Json 简介 Json (JavaScript Object Notation) 是一种轻量级的数据交换格式.它作为目前最欢迎的数据交换格式,也是各大开源贡献者的必争之地,如:阿里爸爸的 fastjson(java),腾讯的 rapidjson(c++) 等.但 .Net 却没有得到大厂的青睐,在 Swifter.Json 之前 .Net 的 Json 解析库都不完美. Swifter.Json 简介 Swifter.Json 是 .Net 平台上一个功能强大,简单易用,稳定及高性能的 Jso

.net使用Newtonsoft.Json.dll解析json过程的几种特殊情况处理

.net用来解析json的库 Newtonsoft.Json.dll 按理说已十分强大,但调用人家的json总有意想不到的情况发生,你没办法要求别人传给你标准的json字符串给你下面是我遇到的几种情况及解决方法:情况1,字段中包含英文引号:{"title": "这个"笑话"一点也不好笑","flag": 0}情况2,{}开头结尾的字段前后有引号:{"content" : "{"微信&qu

Newtonsoft.Json.dll 反序列化JSON字符串

上一篇JSON博客<JSON入门级学习小结--JSON数据结构>中已对JSON做了简单介绍,JSON字符串数组数据样式大概是这样子的: 如今因为项目需求(asp.net web网站,前台向后台传递JSON数据,并对JSON数据处理,详述见博客< <项目经验>--通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中 >),需要对传递的JSON数据反序列化.于是从网上找了许多JSON反序列化的例子,最终决定使用New

.Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程

JSON作为一种轻量级的数据交换格式,简单灵活,被很多系统用来数据交互,作为一名.NET开发人员,JSON.NET无疑是最好的序列化框架,支持XML和JSON序列化,高性能,免费开源,支持LINQ查询.目前已被微软集成于webapi框架之中,因此,熟练掌握JSON.NET相当重要,这篇文章是零度参考官网整理的示例,通过这些示例,可以全面了解JSON.NET提供的功能. Newtonsoft.Json的地址: 官网:http://json.codeplex.com/ 源码地址:https://gi

WCF JSON DATETIME JSON.NET (Newtonsoft.Json.dll)

[DataMember] public DateTime? myTime { get; set; } var timeFormat = new JsonSerializerSettings() { DateFormatHandling = DateFormatHandling.MicrosoftDateFormat }; string json = JsonConvert.SerializeObject(send, timeFormat); ResultData rd = JsonConvert

屌丝技能--转Json(Newtonsoft.Json.dll)

妈妈再也不用为我转Json而担忧了!! 很简单,没什么好说明的,嗯! public class ShowTablePage<T> where T : class, new() { public int total { get; set; } public List<T> rows { get; set; } } public class ShowTablePage { public int total { get; set; } public DataTable rows { ge