1、手动创建JSON对象和数组

JSON格式主要包括对象和数组两种形式,在JSON.NET中分别用JArray和JObject表示,属性用JProperty表示,属性值用 JValue表示,这些对象都直接或间接继承JToken抽象类,而且都有一个ToString方法,该方法用于直接输出元素的JSON字符串表示形式, 我们可以通过JArray和JObject手动创建JSON并序列化,使用方式非常灵活。

JArray array = new JArray();
array.Add("Manual text");
array.Add(new DateTime(2000, 5, 23));
JObject o = new JObject();
o["MyArray"] = array;
string json = o.ToString();
{
"MyArray": [
"Manual text",
"2000-05-23T00:00:00"
]
}

2、用集合的方式初始化JArray数组和JObject对象

JObject o = new JObject { { "Cpu", "Intel" }, { "Memory", 32 }, { "Drives", new JArray { "DVD", "SSD" } } };
Console.WriteLine(o.ToString());
{
"Cpu": "Intel",
"Memory": 32,
"Drives": [
"DVD",
"SSD"
]
}

3、使用动态类型dynamic类型创建JSON数组和对象

C#中的动态类型dynamic允许开发者动态构造对象,这些动态构造的对象在运行时被解析执行,JSON.NET支持动态类型,无需定义类,即可 构造JSON,这一些就像在JavaScript中编写一个对象那样简单,正是因为动态类型在运行时才被解析,所以,在开发工具中不能检查因书写而导致错 误,这点一定要注意。

dynamic product = new JObject();
product.ProductName = "Elbow Grease";
product.Enabled = true;
product.Price = 4.90m;
product.StockCount = 9000;
product.StockValue = 44100;
product.Tags = new JArray("Real", "OnSale");
Console.WriteLine(product.ToString());
{
"ProductName": "Elbow Grease",
"Enabled": true,
"Price": 4.90,
"StockCount": 9000,
"StockValue": 44100,
"Tags": [
"Real",
"OnSale"
]
}

4、使用JTokenWriter创建对象和数组

JTokenWriter writer = new JTokenWriter();
writer.WriteStartObject();
writer.WritePropertyName("name1");
writer.WriteValue("value1");
writer.WritePropertyName("name2");
writer.WriteStartArray();
writer.WriteValue(1);
writer.WriteValue(2);
writer.WriteEndArray();
writer.WriteEndObject();
JObject o = (JObject)writer.Token;
Console.WriteLine(o.ToString());
{
"name1": "value1",
"name2": [
1,
2
]
}

5、使用对象创建JSON对象和数组

JToken、JObject和JArray都提供一个名为FromObject的方法,允许通过一个对象来创建JSON对象。

Computer computer = new Computer
{
Cpu = "Intel",
Memory = 32,
Drives = new List<string> { "DVD", "SSD" }
};
JObject o = (JObject)JToken.FromObject(computer);
Console.WriteLine(o.ToString());
{
"Cpu": "Intel",
"Memory": 32,
"Drives": [
"DVD",
"SSD"
]
}
JArray a = (JArray)JToken.FromObject(computer.Drives);
Console.WriteLine(a.ToString());
[
"DVD",
"SSD"
]

6、使用字符串创建JSON对象和数组

string json = @"['Small', 'Medium','Large']";
JArray a = JArray.Parse(json);
Console.WriteLine(a.ToString());
[
"Small",
"Medium",
"Large"
]
string json = @"{
CPU: 'Intel',
Drives: [
'DVD read/writer', '500 gigabyte hard drive'
]
}";
JObject o = JObject.Parse(json);
Console.WriteLine(o.ToString());
{
"CPU": "Intel",
"Drives": [
"DVD read/writer",
"500 gigabyte hard drive"
]
}

7、使用JToken转换JSON字符串

在示例1中,我们已经说明JToken类型,它是JSON.NET的核心,几乎所有的JSON元素都继承于JToken抽象类,虽然JToken是抽象类,但它也提供一些很有用的基础方法,可以转换一段字符串并判断它应有的JSON类型。

JToken t1 = JToken.Parse("{}");
Console.WriteLine(t1.Type);
// Object JToken t2 = JToken.Parse("[]");
Console.WriteLine(t2.Type);
// Array JToken t3 = JToken.Parse("null");
Console.WriteLine(t3.Type);
// Null JToken t4 = JToken.Parse(@"'A string!'");
Console.WriteLine(t4.Type);
// String

8、动态修改JSON对象和数组

string json = @"{
'channel': {
'title': 'Star Wars',
'link': 'www.xcode.me',
'description': 'Star Wars blog.',
'obsolete': 'Obsolete value',
'item': []
}
}";
JObject rss = JObject.Parse(json);
JObject channel = (JObject)rss["channel"];
channel["title"] = ((string)channel["title"]).ToUpper();
channel["description"] = ((string)channel["description"]).ToUpper();
channel.Property("obsolete").Remove();
channel.Property("description").AddAfterSelf(new JProperty("new", "New value"));
JArray item = (JArray)channel["item"];
item.Add("Item 1");
item.Add("Item 2");
Console.WriteLine(rss.ToString());
{
"channel": {
"title": "STAR WARS",
"link": "www.xcode.com",
"description": "STAR WARS BLOG.",
"new": "New value",
"item": [
"Item 1",
"Item 2"
]
}
}

9、合并两个JSON对象

JObject o1 = JObject.Parse(@"{
'FirstName': 'John',
'LastName': 'Smith',
'Enabled': false,
'Roles': [ 'User' ]
}");
JObject o2 = JObject.Parse(@"{
'Enabled': true,
'Roles': [ 'User', 'Admin' ]
}");
o1.Merge(o2, new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Union });
string json = o1.ToString();
{
"FirstName": "John",
"LastName": "Smith",
"Enabled": true,
"Roles": [
"User",
"Admin"
]
}

这里要特别说明的是JsonMergeSettings,该对象用于设置合并时的行为,MergeArrayHandling是枚举,可设置为 Concat(连接数组)、Union(跳过存在的元素,添加不存在的元素)、Replace(替换所有数组项)和Merge(根据数组索引将数组项合并 在一起)。

10、使用动态类型dynamic查询JSON对象

string json = @"[
{
'Title': 'Json.NET is awesome!',
'Author': {
'Name': 'James Newton-King',
'Twitter': '@JamesNK',
'Picture': '/jamesnk.png'
},
'Date': '2013-01-23T19:30:00'
}
]"; dynamic blogPosts = JArray.Parse(json);
dynamic blogPost = blogPosts[0];
Console.WriteLine(blogPost.Title);
Json.NET is awesome!

11、使用ToObject将JSON对象或数组转换成C#对象

string json = @"{
'd': [
{
'Name': 'John Smith'
},
{
'Name': 'Mike Smith'
}
]
}";
JObject o = JObject.Parse(json);
JArray a = (JArray)o["d"];
IList<Person> person = a.ToObject<IList<Person>>();
Console.WriteLine(person[1].Name);
Mike Smith

12、通过属性遍历JObject对象

JObject o = new JObject { { "name1", "value1" }, { "name2", "value2" } };
foreach (JProperty property in o.Properties())
{
Console.WriteLine(property.Name + " - " + property.Value);
}
name1 - value1
name2 - value2
foreach (KeyValuePair<string, JToken> property in o)
{
Console.WriteLine(property.Key + " - " + property.Value);
}
name1 - value1
name2 - value2

13、使用ToString方法进行JSON序列化

在JSON.NET中ToString方法会输出针对当前JSON对象的字符串表示形式,通过这个特点我们可以序列化对象,默认情况下会输出格式化后的JSON字符串,ToString方法提供一些重载,允许开发灵活配置序列化行为。

JObject o = JObject.Parse(@"{'string1':'value','integer2':99,'datetime3':'2000-05-23T00:00:00'}");
Console.WriteLine(o.ToString());
{
"string1": "value",
"integer2": 99,
"datetime3": "2000-05-23T00:00:00"
}

ToString方法也提供一个是否格式化重载方法,下面的示例演示输出压缩后的JSON字符串。

Console.WriteLine(o.ToString(Formatting.None));
{"string1":"value","integer2":99,"datetime3":"2000-05-23T00:00:00"}

下面的代码演示通过ToString方法提供的重载将日期格式化为JavaScript中的日期对象,这样的JSON在JS中就可以直接使用日期。

Console.WriteLine(o.ToString(Formatting.None, new JavaScriptDateTimeConverter()));
{"string1":"value","integer2":99,"datetime3":new Date(959032800000)}

14、JSON.NET支持BSON格式的序列化和反序列化

BSON是一种类似于JSON格式,是一种二进制形式存储格式,简称BinaryJSON,它和JSON一样,支持内嵌的对象和数组,BSON可以 做为网络数据交换的一种存储形式,它的优点是灵活性高,但它的缺点是空间利用率不是很理想,JSON.NET也支持BSON的序列化和反序列化。

byte[] data = Convert.FromBase64String("KQAAAAJuYW1lMQAHAAAAdmFsdWUxAAJuYW1lMgAHAAAAdmFsdWUyAAA=");
MemoryStream ms = new MemoryStream(data);
JObject o;
using (BsonReader reader = new BsonReader(ms))
{
o = (JObject)JToken.ReadFrom(reader);
}
string value = (string)o["name1"];
Console.WriteLine(value);
value1
JObject o = new JObject { { "name1", "value1" }, { "name2", "value2" } };
MemoryStream ms = new MemoryStream();
using (BsonWriter writer = new BsonWriter(ms))
{
o.WriteTo(writer);
}
string data = Convert.ToBase64String(ms.ToArray());
Console.WriteLine(data);
KQAAAAJuYW1lMQAHAAAAdmFsdWUxAAJuYW1lMgAHAAAAdmFsdWUyAAA=

15、JSON.NET也支持JSON与XML数据格式之间的互转

string json = @"{
'@Id': 1,
'Email': 'james@example.com',
'Active': true,
'CreatedDate': '2013-01-20T00:00:00Z',
'Roles': [
'User',
'Admin'
],
'Team': {
'@Id': 2,
'Name': 'Software Developers',
'Description': 'Creators of fine software products and services.'
}
}";
XNode node = JsonConvert.DeserializeXNode(json, "Root");
Console.WriteLine(node.ToString());
<Root Id="1">
<Email>james@example.com</Email>
<Active>true</Active>
<CreatedDate>2013-01-20T00:00:00Z</CreatedDate>
<Roles>User</Roles>
<Roles>Admin</Roles>
<Team Id="2">
<Name>Software Developers</Name>
<Description>Creators of fine software products and services.</Description>
</Team>
</Root>
string xml = @"<?xml version='1.0' standalone='no'?>
<root>
<person id='1'>
<name>Alan</name>
<url>www.xocde.me</url>
</person>
<person id='2'>
<name>Louis</name>
<url>www.xocde.me</url>
</person>
</root>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string json = JsonConvert.SerializeXmlNode(doc);
Console.WriteLine(json);
{
"?xml": {
"@version": "1.0",
"@standalone": "no"
},
"root": {
"person": [
{
"@id": "1",
"name": "Alan",
"url": "www.xocde.me"
},
{
"@id": "2",
"name": "Louis",
"url": "www.xocde.me"
}
]
}
}

JSON.NET与LINQ序列化示例教程的更多相关文章

  1. .NET 5/.NET Core使用EF Core 5连接MySQL数据库写入/读取数据示例教程

    本文首发于<.NET 5/.NET Core使用EF Core 5(Entity Framework Core)连接MySQL数据库写入/读取数据示例教程> 前言 在.NET Core/. ...

  2. ASP.NET MVC 基于角色的权限控制系统的示例教程

    上一次在 .NET MVC 用户权限管理示例教程中讲解了ASP.NET MVC 通过AuthorizeAttribute类的OnAuthorization方法讲解了粗粒度控制权限的方法,接下来讲解基于 ...

  3. 在JS和.NET中使用JSON (以及使用Linq to JSON定制JSON数据)

    转载原地址: http://www.cnblogs.com/mcgrady/archive/2013/06/08/3127781.html 阅读目录 JSON的两种结构 认识JSON字符串 在JS中如 ...

  4. .NET Core R2安装及示例教程

    .NET Core R2安装及示例教程 Install for Windows - Visual Studio 2015 1 Download Visual Studio 2015 Make sure ...

  5. JSON与js对象序列化

    JavaScript对象表示法(JavaScript Object Notation,简称JSON)是一种轻量级的数据交换格式,它基于js字面量表示法,是js的一个子集.虽然是一个js的子集但是他与语 ...

  6. DynamicObject扩展--实现JSON和DynamicObject的序列化与反序列化

    度娘许久,找不到我满意的答案,于是自己东凑西凑实现一个. DynamicObject扩展--实现JSON和DynamicObject的序列化与反序列化,亲测良好. 看代码 using System; ...

  7. Newtonsoft.Json高级用法DataContractJsonSerializer,JavaScriptSerializer 和 Json.NET即Newtonsoft.Json datatable,dataset,modle,序列化

    原文地址:https://www.cnblogs.com/yanweidie/p/4605212.html Newtonsoft.Json介绍 在做开发的时候,很多数据交换都是以json格式传输的.而 ...

  8. 在mvc返回JSON时出错:序列化类型为“System.Data.Entity.DynamicProxies.Photos....这个会的对象时检测到循环引用 的解决办法

    在MVC中返回JSON时出错,序列化类型为“System.Data.Entity.DynamicProxies.Photos....这个会的对象时检测到循环引用. public ActionResul ...

  9. DELPHI XE2 采用 JSON 的方式来序列化对象

    DELPHI XE2 采用 JSON 的方式来序列化对象 以下代码测试通过.问题是里面的中文,在反序列化后是乱码. 1. 序列化对象为字符串,Subject 里面的中文看起来正常,仍然是中文: 2.  ...

随机推荐

  1. php ceil()函数 语法

    php ceil()函数 语法 ceil()函数怎么用? php ceil()函数的作用是向上舍入为最接近的整数,语法是ceil(number),表示返回不小于参数X的下一个整数,如果没有小数,返回参 ...

  2. UVa 699 The Falling Leaves (树水题)

    Each year, fall in the North Central region is accompanied by the brilliant colors of the leaves on ...

  3. linux查看java jdk jre安装路径和设置环境变量

    一. 查看java jdk安装路径和设置环境变量 windows: set java_home:查看JDK安装路径 java -version:查看JDK版本 linux: whereis java ...

  4. haproxy笔记

    haproxy安装.启动.日志配置 方法1:#安装 yum install haproxy -y #日志配置 sed -i 's/^#$ModLoad imudp/$ModLoad imudp/g' ...

  5. tomcat的stratup小黑框名字修改

    Tomcat的bin目录下:catalina.out文件, TITLE就是Tomcat startup窗口的名称,282行默认是:Tomcat.这里建议改成“服务名+端口号”的方式,看起来一目了然.因 ...

  6. CJE-Jenkins认证工程师考试预约报名流程

    先决条件 考试费用150美元,需要由master/visr信用卡支付 考试全英文  哈哈哈 考试目的 通过各种渠道能够找到Jenkins的学习资料,并能够完成jenkins的配置管理,还是想全面的系统 ...

  7. C语言编译exe添加图标

    C语言是一门通用的计算机编程语言,可以直接编译为可执行文件.在windows下,可执行文件的后缀是exe,我们编写一个最简单的程序test.c: #include <stdlib.h> i ...

  8. linux SMbus错误

    针对piix4_smbus ****host smbus controller not enabled的解决方法 查看文件并用超级权限修改内容 在末尾加入blacklist i2c——piix4 重启 ...

  9. T1317:【例5.2】组合的输出

    [题目描述] 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r≤n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数. 现要求你用递归的方法输出所有组 ...

  10. 用dialog包制作窗口

    #!/bin/bash temp=$(mktemp -t test.XXXXXX) temp2=$(mktemp -t test.XXXXXX) function diskspace { df -k ...