在开发中,我非常喜欢动态语言和匿名对象带来的方便,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; }}

执行结果:

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

  1. linux服务器返回json,Linux 命令行工具解析和格式化输出 JSON的方法

    JSON 是一种轻量级且与语言无关的数据存储格式,易于与大多数编程语言集成,也易于人类理解 -- 当然,如果格式正确的话.JSON 这个词代表 J ava S cript O bject N otat ...

  2. java解析多层json,手把手教你怎么解析多层嵌套的JSON数据(使用JSONModel)

    2018.11.14日更新 前言 没想到这篇简单介绍JSONModel的文章竟然已经破了两千阅读量,一跃成为我阅读量最高的文章,作为iOS小白的我感到万分惶恐 在这一个月的项目中,总是用到JSONMo ...

  3. 深入理解.NET Core的基元: deps.json, runtimeconfig.json, dll文件

    原文链接: Deep-dive into .NET Core primitives: deps.json, runtimeconfig.json, and dll's作者: Nate McMaster ...

  4. Json的序列化和反序列化的几种方式

    [什么是Json] 序列化:将对象转换成字节流的过程,这样就可以轻松将对象保存在磁盘文件或数据库中. 反序列化:序列化的逆过程,就是将字节流转换回原来的对象的过程. 当前主流的序列化JSON字符串主要 ...

  5. json支持的最大长度_Swifter.Json 可能是 .Net 平台迄今为止性能最佳的 Json 序列化库【开源】...

    Json 简介 Json (JavaScript Object Notation) 是一种轻量级的数据交换格式.它作为目前最欢迎的数据交换格式,也是各大开源贡献者的必争之地,如:阿里爸爸的 fast ...

  6. 使用Json.Net处理json序列化和反序列化接口或继承类

    以前一直没有怎么关注过Newtonsoft的Json.Net这个第三方的.NET Json框架,主要是我以前在开发项目的时候大多数使用的都是.NET自带的Json序列化类JavaScriptSeria ...

  7. json,pickle,shelve序列化和反序列化

    1.简介 ●  json:用于字符串 和 python简单数据类型(list,dict...)间进行转换:字符串<--->python简单数据类型 ●  pickle:用于python特有 ...

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

    在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...

  9. c#: Newtonsoft.Json 高级用法一(不创建类,动态解析和构造json、JObject/JArray)

    环境: .net core3.1 vs2019 Newtonsoft.Json 12.0.3 关于newtonsoft.json的使用常见问题参考: <c#:序列化json常见问题及处理方法&g ...

最新文章

  1. [译文]Domain Driven Design Reference(四)—— 柔性设计
  2. Python基础day07【文件读写、文件夹操作、面向对象(类、对象)】
  3. imoocLinux环境变量配置文件笔记
  4. 删库跑路?不可回滚?MySQL创建和管理表,修改清空表,MySQL8新特性DDL原子化,完整详细可收藏
  5. SpringAOP的几大通知
  6. 全球首发!惯性导航导论(剑桥大学)第七部分
  7. maven pom.xml中设置java编译参数
  8. OSG实时纹理提取 离屏渲染 输出到OpenCV 反向渲染 OSG摄像头反转 OSG动态模型 摄像机实时渲染
  9. 联想y470上三代cpu_联想Y470笔记本i3处理器能换i5或者i7处理器嘛?
  10. 如何编制一份软件项目开发计划书
  11. 【面试:基础篇06:FailFast与FailSafe机制】
  12. PTA-数据库作业题(二)
  13. 像素焦距与毫米焦距转换
  14. 让微积分穿梭于工作与学习之间(29):夹逼公式的几种变体
  15. 狼人杀暂时未连接到语音服务器,狼人杀iOS10用户无法连接到服务器 无法更新解决办法...
  16. 前端元素垂直水平居中的多个方法
  17. 眼睛出现这10种症状,是身体在报警!肿瘤、甲亢、糖尿病……
  18. Java操作ElasticSearch,java程序设计教程第二版pdf
  19. 计算机停车场参考文献,计算机本科毕业论文(停车场管理系统).doc
  20. linux服务器风扇功率调整

热门文章

  1. 谷歌浏览器打开播放链接,视频无法播放并且视频黑屏,没声音
  2. C++、构造函数与拷贝构造函数
  3. 手机拍照翻译的简单方法
  4. 计算机专业考试状况,2015年秋季计算机专业考试
  5. 论持续发展创客教育的意义
  6. T1469 ArrayList
  7. word 写论文要求奇偶页眉不同,而页码连续。
  8. 鸿蒙移植i.mx6ull(三) 体验鸿蒙内核Liteos-a
  9. 机器学习相关概念、分类、要解决的任务
  10. 钩子函数和forms组件