json.net与linq序列化示例教程

蚂蚁撼大象      2022-02-09     448

关键词:

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‘: ‘[email protected]‘,
  ‘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>[email protected]</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"
      }
    ]
  }
}

使用newtonsoft.json.dll(json.net)动态解析json.net的json的序列化与反序列化

...常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合、字典、动态对象和匿名对象),在这篇文章中我将通过JToken、... 查看详情

js与c#服务端json数据交互

...象中(根据需求:单个对象,集合,键值对),然后JSON序列化返回给前端。这里可以引用JSON.NET库,也可以用.NET自带的类库: JavaScriptSerializer().Serialize(obj);  JSON序列化后的结果是一个键和值都用双引号括起的字符串: ... 查看详情

Linq 查询 JObject

...】:2013-07-2020:36:27【问题描述】:我正在使用Json.net进行序列化,然后制作一个如下所示的JObject:"RegistrationList":["CaseNumber":"120654-1330","Priority":5,"PersonId":7,"Person":"FirstName":"","LastName":"",," 查看详情

使用 Json.net 反序列化 JSON 对象数组

】使用Json.net反序列化JSON对象数组【英文标题】:DeserializingJSONObjectArraywithJson.net【发布时间】:2013-08-1401:57:09【问题描述】:我正在尝试使用一个API,该API使用以下示例结构来返回其返回的json["customer":"first_name":"Test","last_name":"A... 查看详情

如何使用 System.Linq.Dynamic 检查 JSON 对象是不是与谓词匹配

】如何使用System.Linq.Dynamic检查JSON对象是不是与谓词匹配【英文标题】:HowcanIuseSystem.Linq.DynamictocheckifaJSONobjectmatchesapredicate如何使用System.Linq.Dynamic检查JSON对象是否与谓词匹配【发布时间】:2017-06-2822:50:36【问题描述】:我正在... 查看详情

使用 json.net 中的属性序列化 DataSet/DataTable

】使用json.net中的属性序列化DataSet/DataTable【英文标题】:SerializingaDataSet/DataTablewithpropertiesinjson.net【发布时间】:2014-07-1417:36:31【问题描述】:我正在寻找将数据集序列化为json的解决方案,但我需要获取json中的行状态。json.net... 查看详情

使用json.net来序列化所需的数据

...处理的。而使用Json的时候,我们很多时候会涉及到几个序列化对象的使用:DataContractJsonSerializer,JavaScriptSerializer 和 Json.NET。大多数人都会选择性能以及通用性较好Json.NET,这个不是 查看详情

c#之linq

...来设置初始值。        2、序列化与反序列化序列化:将数据结构或对象转换成二进制串的过程反序列化:将在序列化过程中所生成的二 查看详情

.net(c#)json.net(newtonsoft)使用linq查询json数据

LINQtoJSON提供了许多从对象获取数据的方法。JObject/JArray上的索引方法允许您通过对象或集合索引上的属性名快速获取数据,而Children()允许您以IEnumerable的形式获取数据范围,然后使用LINQ进行查询。原文地址:.NET(C#)Json.Net(newtonsof... 查看详情

使用 Json.Net 转换为 XML 时如何序列化空数组

】使用Json.Net转换为XML时如何序列化空数组【英文标题】:HowtoserializeemptyarrayswhenconvertingtoXMLwithJson.Net【发布时间】:2014-01-2509:55:37【问题描述】:我需要将一些Json转换为XML,但是当我这样做时,它会删除所有空数组/列表/集合/... 查看详情

Newtonsoft JSON.NET 与 Json Web 服务的兼容性

...Json.NET库结合使用吗?换句话说,有没有办法让JSON.NET反序列化webservice的请求的JSON对象,而不是 查看详情

.NET 中的 LINQ to JSON

】.NET中的LINQtoJSON【英文标题】:LINQtoJSONin.NET【发布时间】:2011-06-2809:47:44【问题描述】:有JSON文件这样的东西吗?也就是*.json?可以在没有任何JavaScript内容的情况下在C#代码中使用JSON,在某种程度上作为XML的替代品吗?对于C... 查看详情

使用json.net(newtonsoft.json)作为asp.netmvc的json序列化和反序列化工具

ASP.NetMVC默认的JSON序列化使用的是微软自己的JavaScriptSerializer。性能低不说,最让人受不了的是Dictionary<,>和Hashtable类型居然对应的json是[{"Key":"a","Value":1}]而不是{"a":1}。真是奇葩到家了,跟前端根本没法集成!决定还是用JSON.N... 查看详情

如何在 MVC 5 项目中使用 Json.NET 进行 JSON 模型绑定?

...找答案或示例,但还没有找到。我只是想更改默认的JSON序列化程序,该序列化程序用于在模型绑定到JSON.NET库时反序列化JSON。我找到了thisSO帖子,但目前无法实现,我什 查看详情

使用json.net解决mvc中各种json操作

...文章,用于替换MVC中各种json操作,微软mvc当然用自家的序列化,速度慢不说,还容易出问题,自定义性也太差,比如得特意解决循环引用的问题,比如datetime的序列化格式,比如性能。NewtonSoft.json也就是Json.Net性能虽然不是最好... 查看详情

如何在 asp.net core 3.1 中将 Json.NET 设置为默认序列化程序

】如何在asp.netcore3.1中将Json.NET设置为默认序列化程序【英文标题】:HowdoIsetJson.NETasdefaultserializerinasp.netcore3.1【发布时间】:2020-04-0102:37:44【问题描述】:将ASP.NET核心2.1Web应用程序转换为3.1并发现一些端点损坏,因为新的Json序... 查看详情

json对象的序列化和反序列化

//Json.NET序列化stringjsonData=JsonConvert.SerializeObject(对象model);//Json.NET反序列化stringjson=@"{‘Name‘:‘C#‘,‘Age‘:‘3000‘,‘ID‘:‘1‘,‘Sex‘:‘男‘}";StudentdescJsonStu=JsonConvert.DeserializeObject<对象>(js 查看详情

使用带有 LINQ 的 JSON.NET 计算我的 JSON 文件中的子项数

】使用带有LINQ的JSON.NET计算我的JSON文件中的子项数【英文标题】:CountthenumberofchildreninmyJSONfileusingJSON.NETwithLINQ【发布时间】:2013-12-0506:42:50【问题描述】:我有一个xml:stringxml="<?xml..../>"+"<root>"+"<paramFileversion=1.0>"+"... 查看详情