Json序列化之.NET开源类库Newtonsoft.Json的研究
JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式。它是基于JavaScript语法标准的一个子集。 JSON采用完全独立于语言的文本格式,可以很容易在各种网络、平台和程序之间传输。JSON的语法很简单,易于人阅读和编写,同时也易于机器解析和生成。
JSON与XML的比较◆ 可读性 JSON和XML的可读性相比较而言,由于XML提供辅助的标签,更加适合人阅读和理解。◆ 文件大小与传输 XML允许使用方便的标签,所以文件尺寸是要比JSON大的。而且JSON源于Javascript,所以天生的主战场是Javascript与网络,在这里,JSON有着XML无法赶超的优势。 JSON语法1、 JSON 语法是 JavaScript 对象表示法语法的子集。 • 数据在名称/值对中:名称是字符串,使用双引号表示。值可以是:数字(整数或浮点数),字符串(在双引号中),数组(在方括号中),对象(在花括号中),true/false/null。 • 数据由逗号分隔: • 花括号保存对象:对象可以包含各种数据,包括数组。 • 方括号保存数组:数字可以包含对象。 例如:{ "student": [ { "firstName": "Bill", "lastName": "Gates" }, { "grade": "3", "sex": "boy" } ]}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using System.IO;
using Newtonsoft.Json.Linq; namespace JsonWithNewtonsoft
{
class Program
{
static void Main(string[] args)
{
string jsonText = @"{""Name"" : ""Jack"", ""Age"" : ""22""}";
JsonReader reader = new JsonTextReader(new StringReader(jsonText)); while (reader.Read())
{
Console.WriteLine(reader.TokenType + "\t" + reader.ValueType + "\t" + reader.Value);
}
Console.Read();
}
}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using System.IO;
using Newtonsoft.Json.Linq; namespace JsonWithNewtonsoft
{
class Program
{
static void Main(string[] args)
{
string jsonText = @"{""Name"" : ""Jack"", ""Age"" : ""22""}"; JObject jo = JObject.Parse(jsonText);
string[] values = jo.Properties().Select(item => item.Name.ToString() + ":" + item.Value.ToString()).ToArray();
foreach(string s in values)
{
Console.WriteLine(s);
}
Console.Read();
}
}
}
这里使用JObject来解析Json数据,可以看到这里使用linq取出了Json的Name和Value属性,然后将结果赋给values数组,输出结果如下:

这就是解析Json的两种方法,一种是使用StringReader,一种是使用JObject。
解析数组型数据
到这里Json解析就完了?当然没完!这只是解析最基本的Json数据格式,下面来看下解析数组格式的Json数据,代码如下:
//数组型数据
string jsonArrayText1 = "[{'Name':'Tom','Age':'16'},{'Name':'Mary','Age':'15'}]";
JArray ja = (JArray)JsonConvert.DeserializeObject(jsonArrayText1); string name1 = ja[]["Name"].ToString();
Console.WriteLine(name1);
//或者
JObject o = (JObject)ja[];
string name2 = o["Name"].ToString();
Console.WriteLine(name2);
这里我们定义了两个学生,这里使用JArray这个类型,可以看到,他和数组的用法很像。当然还可以转换成JObject类型,然后再进行取值操作。
解析嵌套性数据
还有一种Json格式,是嵌套格式,来看下如何解析吧。代码如下:
//嵌套格式
jsonText = "{\"shanghai\":{\"zone\":\"浦东\",\"zone_en\":\"pudong\"}}";
jo = (JObject)JsonConvert.DeserializeObject(jsonText);
string zone = jo["shanghai"]["zone"].ToString();
string zone_en = jo["shanghai"]["zone_en"].ToString();
代码很简单,我就不过多的解释了。
到这里,读取和解析Json的内容就讲完了,下面我们来说一下序列化,就是生成Json的方法。
2、序列化Json
先来看一下通用的生成Json的方法吧!就来输出{"Name":"Jack","Age":"26"}代码如下:
//输出{"Name":"Jack","Age":"26"}
StringWriter sw = new StringWriter();
JsonWriter writer = new JsonTextWriter(sw);
writer.WriteStartObject();
writer.WritePropertyName("Name");
writer.WriteValue("Jack");
writer.WritePropertyName("Age");
writer.WriteValue("");
writer.WriteEndObject();
writer.Flush();
jsonText = sw.GetStringBuilder().ToString();
Console.WriteLine(jsonText);
这段代码运行后就是输出{"Name":"Jack","Age":"26"},很简单吧!
下面来添加一个Student类,代码如下,然后对其进行序列化,Student代码:
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
}
下面来new一个Student,并进行序列化和反序列化,代码如下:
Student stu = new Student() { Name = "Jack", Age = };
JsonSerializer serializer = new JsonSerializer();
sw = new StringWriter();
serializer.Serialize(new JsonTextWriter(sw), stu);
Console.WriteLine(sw.GetStringBuilder().ToString());
StringReader sr = new StringReader(sw.GetStringBuilder().ToString());
Student s = (Student)serializer.Deserialize(new JsonTextReader(sr), typeof(Student));
Console.WriteLine(s.Name + "=>" + s.Age);
其输出结果如下:

下面来序列化一个Student列表,看看得到什么,代码如下:
List<Student> students = new List<Student>();
Student stu = new Student() { Name = "Jack", Age = };
Student stu1 = new Student() { Name = "Tom", Age = };
students.Add(stu);
students.Add(stu1);
JsonSerializer serializer = new JsonSerializer();
sw = new StringWriter();
serializer.Serialize(new JsonTextWriter(sw), students);
Console.WriteLine(sw.GetStringBuilder().ToString());
运行结果如下:

看到这个,很熟悉吧,前面刚刚说过怎么解析这种格式的Json!当然,你们还有一种嵌套形式怎么生成呢?下面来修改Studnet类,添加电话号码字段,修改后的Student类如下:
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
public List<string> Phones { get; set; } }
序列化代码如下:
List<Student> students = new List<Student>();
Student stu = new Student() { Name = "Jack", Age = , Phones = new List<string> {"","" }};
Student stu1 = new Student() { Name = "Tom", Age = , Phones = new List<string> { "", "" }};
students.Add(stu);
students.Add(stu1);
JsonSerializer serializer = new JsonSerializer();
sw = new StringWriter();
serializer.Serialize(new JsonTextWriter(sw), students); Console.WriteLine(sw.GetStringBuilder().ToString());
输出Json如下:

看到了吧,是不是前面说到的嵌套类型。解析方法前面也说过了。到这里,Newtonsoft.Json这个类库的使用就讲完了,当然他还有很多其他的功能等待着大家去发现。
如果大家赶紧这篇文章对你有用,请推荐一下或关注我,大家的支持是我最大的动力!
作者:雲霏霏
博客地址:http://www.cnblogs.com/yunfeifei/
声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。
Json序列化之.NET开源类库Newtonsoft.Json的研究的更多相关文章
- Json序列化之.NET开源类库Newtonsoft.Json
上代码: using System; using System.Collections; using System.Collections.Generic; using System.IO; usin ...
- EntityFramework中Json序列化的循环引用问题解决--Newtonsoft.Json
1.在使用EF时,由于数据库主外键关联,将对象进行Json序列化时会遇到循环引用的问题 //EF 中由于数据库主外键关联,对象的序列化经常出现循环引用问题 //使用.Net 自带的序列化工具,序列化出 ...
- C# Json 序列化和反序列化 工具类 Newtonsoft.Json.dll
引用: Newtonsoft.Json.dll // 引用: using Newtonsoft.Json; using Newtonsoft.Json.Converters; // 定义 实体测试类 ...
- [Swift通天遁地]七、数据与安全-(3)Cocopods的安装和开源类库对JSON的解析
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Swifter.Json 可能是 .Net 平台迄今为止性能最佳的 Json 序列化库【开源】
Json 简介 Json (JavaScript Object Notation) 是一种轻量级的数据交换格式.它作为目前最欢迎的数据交换格式,也是各大开源贡献者的必争之地,如:阿里爸爸的 fastj ...
- 解决MVC Json序列化的循环引用问题/EF Json序列化循引用问题---Newtonsoft.Json
1..Net开源Json序列化工具Newtonsoft.Json中提供了解决序列化的循环引用问题: 方式1:指定Json序列化配置为 ReferenceLoopHandling.Ignore 方式2: ...
- MVC web api 返回JSON的几种方式,Newtonsoft.Json序列化日期时间去T的几种方式。
原文链接:https://www.muhanxue.com/essays/2015/01/8623699.html MVC web api 返回JSON的几种方式 1.在WebApiConfig的Re ...
- C#实现JSON序列化与反序列化
1.使用 JavaScriptSerializer类实现序列化 namespace: System.Web.Script.Serialization eg: // 序列化 private string ...
- Json序列化对象
之前都是用的二进制的序列化方法,是.net自带的,但是最常用到的还是Json序列化 (1)只需要调用 Newtonsoft.Json.dll 即可 public class JsonTools { / ...
随机推荐
- php memcache扩展 出现错误dyld: Symbol not found: _mmc_queue_free
mac 10.10 系统安装php memcache扩展 在使用memcache的时候出现错误dyld: Symbol not found: _mmc_queue_free需要重新编译memcache ...
- 编译运行java程序出现Exception in thread "main" java.lang.UnsupportedClassVersionError: M : Unsupported major.minor version 51.0
用javac编译了一个M.java文件, 然后用java M执行,可是出现了下面这个错误. Exception in thread "main" java.lang.Unsuppo ...
- Codeforces Round #379 (Div. 2) Analyses By Team:Red & Black
A.Anton and Danik Problems: 给你长度为N的,只含'A','D'的序列,统计并输出何者出现的较多,相同为"Friendship" Analysis: lu ...
- VIM的一些操作小技巧
vim的设计理念是:组合. 命令的组合,模式的组合, 普通模式 左: h 上:k 下:j 右 : l i : 当前光标处插入 I: 到光标所在行的行首进入插入模式 a: 在当前光标的后一位 ...
- [fortify] 变量覆盖漏洞
一.全局变量覆盖当register_global=ON时,变量来源可能是各个不同的地方,比如页面的表单,Cookie等. <?php echo "Register_globals: & ...
- VMware克隆虚拟机,克隆机网卡启动不了解决方案
Shutting down loopback interface: [ OK ] Bringing up loopback interface: [ OK ] Bringing up interfac ...
- c#用正则表达式判断字符串是否全是数字、小数点、正负号组成 Regex reg = new Regex(@"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$");
Regex reg = new Regex(@"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][ ...
- JS变量和函数的一些理解
今日看了下JS变量的一些文章,有些感触,把自己总结的一些写出来. JS初始化的过程1.JS解释器执行代码之前,创建全局变量2.用预定义的值和函数来初始化全局对象中的属性,3.搜索函数外的var声明,创 ...
- Microsoft Visual Studio 2010 已安装的模板 没有 “ADO.NET实体数据模型”
2010 sp1才包括entity framework. 装一个补丁即可 地址为:http://www.microsoft.com/zh-CN/download/details.aspx?id=236 ...
- 6410移植android4.4.2笔记(持续更新)
如之前的android编译笔记里面描述,目前已经可以编译出armv7-neon的android镜像了,也就是说目前的环境以及aosp可以支持定制android程序了. 昨天晚上在device下面已经粗 ...