C# Json.Net解析实例

本文以一个简单的小例子,简述Json.Net的相关知识,仅供学习分享使用,如有不足之处,还请指正。

概述

Json.Net is a Popular high-performance JSON framework for .NET. 

Json.Net是当前比较流行的高效的Json解析的.Net框架。主要支持序列化,反序列化,手动解析,Linq等功能,可谓是功能强大而使用简单。

  • 使用方式:在项目中引入Newtonsoft.Json.dll文件即可里面的功能。
  • 常见功能:序列化与反序列化
  • 常用的类:JsonConvert,JsonSerializerSettings,JValue , JArray , JObject , Formatting , JTokenWriter , JToken

效果图

具体如下图所示【序列化和反序列化】:

核心代码

序列化和反序列化的代码如下

  1 public partial class JsonForm : Form
  2     {
  3         public JsonForm()
  4         {
  5             InitializeComponent();
  6         }
  7 
  8         /// <summary>
  9         /// 序列化对象
 10         /// </summary>
 11         /// <param name="sender"></param>
 12         /// <param name="e"></param>
 13         private void btnSerializeObject_Click(object sender, EventArgs e)
 14         {
 15             Person p = new Person()
 16             {
 17                 Name = "Hexiang",
 18                 Birthday = DateTime.Parse("2017-02-20 14:30:00"),
 19                 Gender = "",
 20                 Love = "Ball"
 21             };
 22             string strJson = JsonConvert.SerializeObject(p, Formatting.Indented);
 23             this.txtJson.Text = strJson;
 24         }
 25 
 26         /// <summary>
 27         /// 序列化字典
 28         /// </summary>
 29         /// <param name="sender"></param>
 30         /// <param name="e"></param>
 31         private void btnSerializeDictionary_Click(object sender, EventArgs e)
 32         {
 33             Dictionary<string, int> dicPoints = new Dictionary<string, int>(){
 34                 { "James", 9001 },
 35                 { "Jo", 3474 },
 36                 { "Jess", 11926 }
 37             };
 38 
 39             string strJson = JsonConvert.SerializeObject(dicPoints, Formatting.Indented);
 40 
 41             this.txtJson.Text = strJson;
 42 
 43         }
 44 
 45         /// <summary>
 46         /// 序列化List
 47         /// </summary>
 48         /// <param name="sender"></param>
 49         /// <param name="e"></param>
 50         private void btnSerializeList_Click(object sender, EventArgs e)
 51         {
 52             List<string> lstGames = new List<string>()
 53             {
 54                  "Starcraft",
 55                  "Halo",
 56                  "Legend of Zelda"
 57             };
 58 
 59             string strJson = JsonConvert.SerializeObject(lstGames);
 60 
 61             this.txtJson.Text = strJson;
 62         }
 63 
 64         /// <summary>
 65         /// 序列化到文件
 66         /// </summary>
 67         /// <param name="sender"></param>
 68         /// <param name="e"></param>
 69         private void btnSerializeToFile_Click(object sender, EventArgs e)
 70         {
 71             Person p = new Person()
 72             {
 73                 Name = "Hexiang",
 74                 Birthday = DateTime.Parse("2017-02-20 14:30:00"),
 75                 Gender = "",
 76                 Love = "Ball"
 77             };
 78             using (StreamWriter file = File.CreateText(@"d:\person.json"))
 79             {
 80                 JsonSerializer serializer = new JsonSerializer();
 81                 serializer.Serialize(file, p);
 82             }
 83         }
 84 
 85         /// <summary>
 86         /// 序列化枚举
 87         /// </summary>
 88         /// <param name="sender"></param>
 89         /// <param name="e"></param>
 90         private void btnSerializeEnum_Click(object sender, EventArgs e)
 91         {
 92             List<StringComparison> stringComparisons = new List<StringComparison>
 93             {
 94                  StringComparison.CurrentCulture,
 95                  StringComparison.Ordinal
 96              };
 97 
 98             string jsonWithoutConverter = JsonConvert.SerializeObject(stringComparisons);
 99 
100             this.txtJson.Text = jsonWithoutConverter;//序列化出来是枚举所代表的整数值
101 
102 
103             string jsonWithConverter = JsonConvert.SerializeObject(stringComparisons, new StringEnumConverter());
104             this.txtJson.Text += "\r\n";
105             this.txtJson.Text += jsonWithConverter;//序列化出来是枚举所代表的文本值
106             // ["CurrentCulture","Ordinal"]
107 
108             List<StringComparison> newStringComparsions = JsonConvert.DeserializeObject<List<StringComparison>>(
109                jsonWithConverter,
110                 new StringEnumConverter());
111         }
112 
113         /// <summary>
114         /// 序列化DataSet
115         /// </summary>
116         /// <param name="sender"></param>
117         /// <param name="e"></param>
118         private void btnSerializeDataSet_Click(object sender, EventArgs e)
119         {
120             DataSet dataSet = new DataSet("dataSet");
121             dataSet.Namespace = "NetFrameWork";
122             DataTable table = new DataTable();
123             DataColumn idColumn = new DataColumn("id", typeof(int));
124             idColumn.AutoIncrement = true;
125 
126             DataColumn itemColumn = new DataColumn("item");
127             table.Columns.Add(idColumn);
128             table.Columns.Add(itemColumn);
129             dataSet.Tables.Add(table);
130 
131             for (int i = 0; i < 2; i++)
132             {
133                 DataRow newRow = table.NewRow();
134                 newRow["item"] = "item " + i;
135                 table.Rows.Add(newRow);
136             }
137 
138             dataSet.AcceptChanges();
139 
140             string json = JsonConvert.SerializeObject(dataSet, Formatting.Indented);
141             this.txtJson.Text = json;
142         }
143 
144         /// <summary>
145         /// 序列化JRaw
146         /// </summary>
147         /// <param name="sender"></param>
148         /// <param name="e"></param>
149         private void btnSerializeRaw_Click(object sender, EventArgs e)
150         {
151             JavaScriptSettings settings = new JavaScriptSettings
152             {
153                 OnLoadFunction = new JRaw("OnLoad"),
154                 OnUnloadFunction = new JRaw("function(e) { alert(e); }")
155             };
156 
157             string json = JsonConvert.SerializeObject(settings, Formatting.Indented);
158 
159             this.txtJson.Text = json;
160 
161         }
162 
163         /// <summary>
164         /// 反序列化List
165         /// </summary>
166         /// <param name="sender"></param>
167         /// <param name="e"></param>
168         private void btnDeserializeList_Click(object sender, EventArgs e)
169         {
170             string json = @"['Starcraft','Halo','Legend of Zelda']";
171             List<string> videogames = JsonConvert.DeserializeObject<List<string>>(json);
172             this.txtJson.Text = string.Join(", ", videogames.ToArray());
173         }
174 
175         /// <summary>
176         /// 反序列化字典
177         /// </summary>
178         /// <param name="sender"></param>
179         /// <param name="e"></param>
180         private void btnDeserializeDictionary_Click(object sender, EventArgs e)
181         {
182             string json = @"{
183               'href': '/account/login.aspx',
184               'target': '_blank'
185              }";
186 
187             Dictionary<string, string> dicAttributes = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
188 
189             this.txtJson.Text = dicAttributes["href"];
190             this.txtJson.Text += "\r\n";
191             this.txtJson.Text += dicAttributes["target"];
192 
193 
194         }
195 
196         /// <summary>
197         /// 反序列化匿名类
198         /// </summary>
199         /// <param name="sender"></param>
200         /// <param name="e"></param>
201         private void btnDeserializeAnaymous_Click(object sender, EventArgs e)
202         {
203             var definition = new { Name = "" };
204 
205             string json1 = @"{'Name':'James'}";
206             var customer1 = JsonConvert.DeserializeAnonymousType(json1, definition);
207             this.txtJson.Text = customer1.Name;
208             this.txtJson.Text += "\r\n";
209 
210             string json2 = @"{'Name':'Mike'}";
211             var customer2 = JsonConvert.DeserializeAnonymousType(json2, definition);
212             this.txtJson.Text += customer2.Name;
213 
214         }
215 
216         /// <summary>
217         /// 反序列化DataSet
218         /// </summary>
219         /// <param name="sender"></param>
220         /// <param name="e"></param>
221         private void btnDeserializeDataSet_Click(object sender, EventArgs e)
222         {
223             string json = @"{
224                'Table1': [
225                  {
226                   'id': 0,
227                   'item': 'item 0'
228                  },
229                  {
230                    'id': 1,
231                   'item': 'item 1'
232                 }
233               ]
234             }";
235 
236             DataSet dataSet = JsonConvert.DeserializeObject<DataSet>(json);
237 
238             DataTable dataTable = dataSet.Tables["Table1"];
239             this.txtJson.Text = dataTable.Rows.Count.ToString();
240 
241 
242             foreach (DataRow row in dataTable.Rows)
243             {
244                 this.txtJson.Text += "\r\n";
245                 this.txtJson.Text += (row["id"] + " - " + row["item"]);
246             }
247 
248         }
249 
250         /// <summary>
251         /// 从文件反序列化
252         /// </summary>
253         /// <param name="sender"></param>
254         /// <param name="e"></param>
255         private void btnDeserializeFrmFile_Click(object sender, EventArgs e)
256         {
257             using (StreamReader file = File.OpenText(@"d:\person.json"))
258             {
259                 JsonSerializer serializer = new JsonSerializer();
260                 Person p = (Person)serializer.Deserialize(file, typeof(Person));
261                 this.txtJson.Text = p.Name;
262             }
263         }
264 
265         /// <summary>
266         /// 反序列化带构造函数人类
267         /// </summary>
268         /// <param name="sender"></param>
269         /// <param name="e"></param>
270         private void btnDeserializeConstructor_Click(object sender, EventArgs e)
271         {
272             string json = @"{'Url':'http://www.google.com'}";
273 
274             //直接序列化会报错,需要设置JsonSerializerSettings中ConstructorHandling才可以。
275             Website website = JsonConvert.DeserializeObject<Website>(json, new JsonSerializerSettings
276             {
277                 ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor
278             });
279 
280             this.txtJson.Text = website.Url;
281 
282         }
283 
284         /// <summary>
285         /// 反序列化对象,如果有构造函数中,创建对象,则用Json的进行替换
286         /// </summary>
287         /// <param name="sender"></param>
288         /// <param name="e"></param>
289         private void btnDeserializeObjectCreation_Click(object sender, EventArgs e)
290         {
291             //
292             string json = @"{
293                'Name': 'James',
294                'Offices': [
295                  'Auckland',
296                  'Wellington',
297                  'Christchurch'
298                ]
299              }";
300 
301             UserViewModel model1 = JsonConvert.DeserializeObject<UserViewModel>(json);
302 
303             this.txtJson.Text = string.Join(",", model1.Offices);//默认会重复
304             this.txtJson.Text += "\r\n";
305 
306             //每次从Json中创建新的对象
307             UserViewModel model2 = JsonConvert.DeserializeObject<UserViewModel>(json, new JsonSerializerSettings
308             {
309                 ObjectCreationHandling = ObjectCreationHandling.Replace
310             });
311 
312             this.txtJson.Text = string.Join(",", model2.Offices);
313 
314         }
315 
316         /// <summary>
317         /// 序列化默认值处理,没有赋值的则不序列化出来
318         /// </summary>
319         /// <param name="sender"></param>
320         /// <param name="e"></param>
321         private void btnSerializeDefautValue_Click(object sender, EventArgs e)
322         {
323             Person person = new Person();
324 
325             string jsonIncludeDefaultValues = JsonConvert.SerializeObject(person, Formatting.Indented);
326 
327             this.txtJson.Text=(jsonIncludeDefaultValues);//默认的序列化,带不赋值的属性
328 
329             this.txtJson.Text += "\r\n";
330 
331             string jsonIgnoreDefaultValues = JsonConvert.SerializeObject(person, Formatting.Indented, new JsonSerializerSettings
332             {
333                 DefaultValueHandling = DefaultValueHandling.Ignore //去掉不赋值的属性
334             });
335 
336             this.txtJson.Text+=(jsonIgnoreDefaultValues);
337         }
338 
339         /// <summary>
340         /// 如果实体类中没有对应属性,则如何处理
341         /// </summary>
342         /// <param name="sender"></param>
343         /// <param name="e"></param>
344         private void btnDeserializeMissingMember_Click(object sender, EventArgs e)
345         {
346             string json = @"{
347                'FullName': 'Dan Deleted',
348                'Deleted': true,
349                'DeletedDate': '2013-01-20T00:00:00'
350              }";
351 
352             try
353             {
354                 JsonConvert.DeserializeObject<Account>(json, new JsonSerializerSettings
355                 {
356                     MissingMemberHandling = MissingMemberHandling.Error //要么忽略,要么报错
357                 });
358             }
359             catch (JsonSerializationException ex)
360             {
361                 this.txtJson.Text=(ex.Message);
362                 // Could not find member 'DeletedDate' on object of type 'Account'. Path 'DeletedDate', line 4, position 23.
363             }
364         }
365 
366         /// <summary>
367         /// 序列化时Null值的处理
368         /// </summary>
369         /// <param name="sender"></param>
370         /// <param name="e"></param>
371         private void btnSerializeNull_Click(object sender, EventArgs e)
372         {
373             Person person = new Person
374             {
375                 Name = "Nigal Newborn"
376             };
377 
378             //默认的序列化
379             string jsonIncludeNullValues = JsonConvert.SerializeObject(person, Formatting.Indented);
380 
381             this.txtJson.Text=(jsonIncludeNullValues);
382             this.txtJson.Text += "\r\n";
383 
384             //去掉Null值的序列化
385             string jsonIgnoreNullValues = JsonConvert.SerializeObject(person, Formatting.Indented, new JsonSerializerSettings
386             {
387                 NullValueHandling = NullValueHandling.Ignore //可以忽略,可以包含
388             });
389 
390            this.txtJson.Text+=(jsonIgnoreNullValues);
391            
392         }
393 
394         /// <summary>
395         /// 序列化日期格式
396         /// </summary>
397         /// <param name="sender"></param>
398         /// <param name="e"></param>
399         private void btnSerializeDateTime_Click(object sender, EventArgs e)
400         {
401             DateTime mayanEndOfTheWorld = new DateTime(2012, 12, 21);
402 
403             string jsonIsoDate = JsonConvert.SerializeObject(mayanEndOfTheWorld);
404 
405             this.txtJson.Text = (jsonIsoDate);
406 
407             this.txtJson.Text += "\r\n";
408             string jsonMsDate = JsonConvert.SerializeObject(mayanEndOfTheWorld, new JsonSerializerSettings
409             {
410                 DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
411             });
412 
413             this.txtJson.Text += (jsonMsDate);
414             // "\/Date(1356044400000+0100)\/"
415             this.txtJson.Text += "\r\n";
416             string json = JsonConvert.SerializeObject(mayanEndOfTheWorld, new JsonSerializerSettings
417             {
418                 DateFormatString = "yyyy-MM-dd",
419                 Formatting = Formatting.Indented
420             });
421             this.txtJson.Text += json;
422         }
423 
424         private void btnSerializeDateZone_Click(object sender, EventArgs e)
425         {
426             Flight flight = new Flight
427             {
428                 Destination = "Dubai",
429                 DepartureDate = new DateTime(2013, 1, 21, 0, 0, 0, DateTimeKind.Unspecified),
430                 DepartureDateUtc = new DateTime(2013, 1, 21, 0, 0, 0, DateTimeKind.Utc),
431                 DepartureDateLocal = new DateTime(2013, 1, 21, 0, 0, 0, DateTimeKind.Local),
432                 Duration = TimeSpan.FromHours(5.5)
433             };
434 
435             string jsonWithRoundtripTimeZone = JsonConvert.SerializeObject(flight, Formatting.Indented, new JsonSerializerSettings
436             {
437                 DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind
438             });
439 
440             this.txtJson.Text=(jsonWithRoundtripTimeZone);
441             this.txtJson.Text += "\r\n";
442             string jsonWithLocalTimeZone = JsonConvert.SerializeObject(flight, Formatting.Indented, new JsonSerializerSettings
443             {
444                 DateTimeZoneHandling = DateTimeZoneHandling.Local
445             });
446 
447             this.txtJson.Text+=(jsonWithLocalTimeZone);
448             this.txtJson.Text += "\r\n";
449 
450             string jsonWithUtcTimeZone = JsonConvert.SerializeObject(flight, Formatting.Indented, new JsonSerializerSettings
451             {
452                 DateTimeZoneHandling = DateTimeZoneHandling.Utc
453             });
454 
455             this.txtJson.Text += (jsonWithUtcTimeZone);
456             this.txtJson.Text += "\r\n";
457 
458             string jsonWithUnspecifiedTimeZone = JsonConvert.SerializeObject(flight, Formatting.Indented, new JsonSerializerSettings
459             {
460                 DateTimeZoneHandling = DateTimeZoneHandling.Unspecified
461             });
462 
463             this.txtJson.Text += (jsonWithUnspecifiedTimeZone);
464 
465         }
466 
467         private void btnSerializeDataContract_Click(object sender, EventArgs e)
468         {
469             CFile file = new CFile
470             {
471                 Id = Guid.NewGuid(),
472                 Name = "ImportantLegalDocuments.docx",
473                 Size = 50 * 1024
474             };
475 
476             string json = JsonConvert.SerializeObject(file, Formatting.Indented);
477 
478             this.txtJson.Text=(json);
479         }
480 
481         /// <summary>
482         /// 序列化默认设置
483         /// </summary>
484         /// <param name="sender"></param>
485         /// <param name="e"></param>
486         private void btnSerializeDefaultSetting_Click(object sender, EventArgs e)
487         {
488             // settings will automatically be used by JsonConvert.SerializeObject/DeserializeObject
489             JsonConvert.DefaultSettings = () => new JsonSerializerSettings
490             {
491                 Formatting = Formatting.Indented,
492                 ContractResolver = new CamelCasePropertyNamesContractResolver()
493             };
494 
495             Person s = new Person()
496             {
497                 Name = "Eric",
498                 Birthday = new DateTime(1980, 4, 20, 0, 0, 0, DateTimeKind.Utc),
499                 Gender = "",
500                 Love = "Web Dude"
501             };
502 
503             string json = JsonConvert.SerializeObject(s);
504             this.txtJson.Text = json;
505         }
506 
507         /// <summary>
508         /// 序列化Immutable
509         /// </summary>
510         /// <param name="sender"></param>
511         /// <param name="e"></param>
512         private void btnSerializeImmutable_Click(object sender, EventArgs e)
513         {
514             //ImmutableList<string> l = ImmutableList.CreateRange(new List<string>
515             // {
516             //                   "One",
517             //     "II",
518             //     "3"
519             // });
520 
521             //string json = JsonConvert.SerializeObject(l, Formatting.Indented);
522 
523         }
524 
525         /// <summary>
526         /// 序列化JsonProperty
527         /// </summary>
528         /// <param name="sender"></param>
529         /// <param name="e"></param>
530         private void btnSerializeJsonProperty_Click(object sender, EventArgs e)
531         {
532             Videogame starcraft = new Videogame
533             {
534                 Name = "Starcraft",
535                 ReleaseDate = new DateTime(1998, 1, 1)
536             };
537 
538             string json = JsonConvert.SerializeObject(starcraft, Formatting.Indented);
539 
540             this.txtJson.Text = json;
541         }
542 
543         /// <summary>
544         /// 序列化排序,值越小,月靠前,默认是0
545         /// </summary>
546         /// <param name="sender"></param>
547         /// <param name="e"></param>
548         private void btnSerializeOrder_Click(object sender, EventArgs e)
549         {
550             Account0 account = new Account0
551             {
552                 FullName = "Aaron Account",
553                 EmailAddress = "aaron@example.com",
554                 Deleted = true,
555                 DeletedDate = new DateTime(2013, 1, 25),
556                 UpdatedDate = new DateTime(2013, 1, 25),
557                 CreatedDate = new DateTime(2010, 10, 1)
558             };
559 
560             string json = JsonConvert.SerializeObject(account, Formatting.Indented);
561 
562             this.txtJson.Text=(json);
563 
564         }
565 
566         private void btnSerializeJsonConstructor_Click(object sender, EventArgs e)
567         {
568             string json = @"{
569               ""UserName"": ""domain\\username"",
570               ""Enabled"": true
571             }";
572 
573             User user = JsonConvert.DeserializeObject<User>(json);
574 
575             this.txtJson.Text=(user.UserName);
576 
577         }
578 
579         private void btnSerializeJsonIgnore_Click(object sender, EventArgs e)
580         {
581             Account1 account = new Account1
582             {
583                 FullName = "Joe User",
584                 EmailAddress = "joe@example.com",
585                 PasswordHash = "VHdlZXQgJ1F1aWNrc2lsdmVyJyB0byBASmFtZXNOSw=="
586             };
587 
588             string json = JsonConvert.SerializeObject(account);
589             this.txtJson.Text = json;
590         }
591 
592         /// <summary>
593         /// 其他功能
594         /// </summary>
595         /// <param name="sender"></param>
596         /// <param name="e"></param>
597         private void btnOtherFunction_Click(object sender, EventArgs e)
598         {
599             JsonForm1 jsonOther = new JsonForm1();
600             jsonOther.ShowDialog();
601         }
602     }
View Code

其他功能


具体如下图所示【其他功能】:

其他功能代码如下

  1 public partial class JsonForm1 : Form
  2     {
  3         public JsonForm1()
  4         {
  5             InitializeComponent();
  6         }
  7 
  8         /// <summary>
  9         /// 手动创建Json
 10         /// </summary>
 11         /// <param name="sender"></param>
 12         /// <param name="e"></param>
 13         private void btnCreateJsonManually_Click(object sender, EventArgs e)
 14         {
 15             JArray array = new JArray();
 16             array.Add("Manual text");
 17             array.Add(new DateTime(2000, 5, 23));
 18 
 19             JObject o = new JObject();
 20             o["MyArray"] = array;
 21 
 22             string json = o.ToString();
 23             this.txtJson.Text = json;
 24 
 25         }
 26         
 27         /// <summary>
 28         /// 列表创建Json
 29         /// </summary>
 30         /// <param name="sender"></param>
 31         /// <param name="e"></param>
 32         private void btnCollectionJson_Click(object sender, EventArgs e)
 33         {
 34             JObject o = new JObject()
 35             {
 36                 { "Cpu", "Intel" },
 37                 { "Memory", 32 },
 38                 {
 39                     "Drives", new JArray
 40                     {
 41                     "DVD",
 42                     "SSD"
 43                     }
 44                 }
 45             };
 46 
 47             this.txtJson.Text = o.ToString();
 48         }
 49 
 50         private void btnCreateJsonByDynamic_Click(object sender, EventArgs e)
 51         {
 52             dynamic product = new JObject();
 53             product.ProductName = "Elbow Grease";
 54             product.Enabled = true;
 55             product.Price = 4.90m;
 56             product.StockCount = 9000;
 57             product.StockValue = 44100;
 58             product.Tags = new JArray("Real", "OnSale");
 59             this.txtJson.Text = product.ToString();
 60 
 61         }
 62         
 63         /// <summary>
 64         /// 从JTokenWriter创建Json
 65         /// </summary>
 66         /// <param name="sender"></param>
 67         /// <param name="e"></param>
 68         private void btnJTokenWriter_Click(object sender, EventArgs e)
 69         {
 70             JTokenWriter writer = new JTokenWriter();
 71             writer.WriteStartObject();
 72             writer.WritePropertyName("name1");
 73             writer.WriteValue("value1");
 74             writer.WritePropertyName("name2");
 75             writer.WriteStartArray();
 76             writer.WriteValue(1);
 77             writer.WriteValue(2);
 78             writer.WriteEndArray();
 79             writer.WriteEndObject();
 80 
 81             JObject o = (JObject)writer.Token;
 82 
 83             this.txtJson.Text = o.ToString();
 84         }
 85 
 86         /// <summary>
 87         /// 从对象创建Json
 88         /// </summary>
 89         /// <param name="sender"></param>
 90         /// <param name="e"></param>
 91         private void btnCreateJsonFromObject_Click(object sender, EventArgs e)
 92         {
 93             JValue i = (JValue)JToken.FromObject(12345);
 94 
 95             Console.WriteLine(i.Type);
 96             // Integer
 97             Console.WriteLine(i.ToString());
 98             // 12345
 99 
100             JValue s = (JValue)JToken.FromObject("A string");
101 
102             Console.WriteLine(s.Type);
103             // String
104             Console.WriteLine(s.ToString());
105             // A string
106 
107             Computer computer = new Computer
108             {
109                 Cpu = "Intel",
110                 Memory = 32,
111                 Drives = new List<string>
112                 {
113                     "DVD",
114                     "SSD"
115                 }
116              };
117 
118             JObject o = (JObject)JToken.FromObject(computer);
119 
120             Console.WriteLine(o.ToString());
121             // {
122             //   "Cpu": "Intel",
123             //   "Memory": 32,
124             //   "Drives": [
125             //     "DVD",
126             //     "SSD"
127             //   ]
128             // }
129 
130             JArray a = (JArray)JToken.FromObject(computer.Drives);
131 
132             Console.WriteLine(a.ToString());
133             // [
134             //   "DVD",
135             //   "SSD"
136             // ]
137         }
138 
139         /// <summary>
140         /// 从匿名对象创建
141         /// </summary>
142         /// <param name="sender"></param>
143         /// <param name="e"></param>
144         private void btnCreateFromAnaymous_Click(object sender, EventArgs e)
145         {
146             List<Post> posts = new List<Post>
147             {
148                 new Post
149                 {
150                     Title = "Episode VII",
151                     Description = "Episode VII production",
152                     Categories = new List<string>
153                     {
154                         "episode-vii",
155                         "movie"
156                     },
157                     Link = "episode-vii-production.aspx"
158                 }
159             };
160 
161             JObject o = JObject.FromObject(new
162             {
163                 channel = new
164                 {
165                     title = "Star Wars",
166                     link = "http://www.starwars.com",
167                     description = "Star Wars blog.",
168                     item =
169                         from p in posts
170                         orderby p.Title
171                         select new
172                         {
173                             title = p.Title,
174                             description = p.Description,
175                             link = p.Link,
176                             category = p.Categories
177                         }
178                 }
179             });
180 
181             this.txtJson.Text=o.ToString();
182 
183         }
184 
185         /// <summary>
186         /// Parse
187         /// </summary>
188         /// <param name="sender"></param>
189         /// <param name="e"></param>
190         private void btnJArrayParse_Click(object sender, EventArgs e)
191         {
192             string json = @"[
193                'Small',
194                'Medium',
195                'Large'
196              ]";
197 
198             JArray a = JArray.Parse(json);
199 
200             this.txtJson.Text = a.ToString();
201             this.txtJson.Text += "\r\n";
202 
203             json = @"{
204                CPU: 'Intel',
205                Drives: [
206                  'DVD read/writer',
207                  '500 gigabyte hard drive'
208                ]
209              }";
210 
211             JObject o = JObject.Parse(json);
212 
213             this.txtJson.Text += o.ToString();
214 
215             JToken t1 = JToken.Parse("{}");
216 
217             Console.WriteLine(t1.Type);
218             // Object
219 
220             JToken t2 = JToken.Parse("[]");
221 
222             Console.WriteLine(t2.Type);
223             // Array
224 
225             JToken t3 = JToken.Parse("null");
226 
227             Console.WriteLine(t3.Type);
228             // Null
229 
230             JToken t4 = JToken.Parse(@"'A string!'");
231 
232             Console.WriteLine(t4.Type);
233             // String
234         }
235 
236         private void btnDeserializeJsonLinq_Click(object sender, EventArgs e)
237         {
238             string json = @"[
239                {
240                  'Title': 'Json.NET is awesome!',
241                  'Author': {
242                    'Name': 'James Newton-King',
243                    'Twitter': '@JamesNK',
244                    'Picture': '/jamesnk.png'
245                  },
246                  'Date': '2013-01-23T19:30:00',
247                 'BodyHtml': '&lt;h3&gt;Title!&lt;/h3&gt;\r\n&lt;p&gt;Content!&lt;/p&gt;'
248               }
249             ]";
250 
251             JArray blogPostArray = JArray.Parse(json);
252 
253             IList<BlogPost> blogPosts = blogPostArray.Select(p => new BlogPost
254             {
255                 Title = (string)p["Title"],
256                 AuthorName = (string)p["Author"]["Name"],
257                 AuthorTwitter = (string)p["Author"]["Twitter"],
258                 PostedDate = (DateTime)p["Date"],
259                 Body = HttpUtility.HtmlDecode((string)p["BodyHtml"])
260             }).ToList();
261 
262             this.txtJson.Text=(blogPosts[0].Body);
263 
264         }
265 
266         private void btnSerializeJson_Click(object sender, EventArgs e)
267         {
268             IList<BlogPost> blogPosts = new List<BlogPost>
269              {
270                  new BlogPost
271                  {
272                      Title = "Json.NET is awesome!",
273                      AuthorName = "James Newton-King",
274                      AuthorTwitter = "JamesNK",
275                      PostedDate = new DateTime(2013, 1, 23, 19, 30, 0),
276                      Body = @"<h3>Title!</h3>
277                              <p>Content!</p>"
278                 }
279               };
280 
281             JArray blogPostsArray = new JArray(
282                 blogPosts.Select(p => new JObject
283                 {
284                 { "Title", p.Title },
285                 {
286                     "Author", new JObject
287                     {
288                         { "Name", p.AuthorName },
289                         { "Twitter", p.AuthorTwitter }
290                     }
291                 },
292                 { "Date", p.PostedDate
293             },
294                 { "BodyHtml", HttpUtility.HtmlEncode(p.Body) },
295             })
296             );
297 
298             this.txtJson.Text=(blogPostsArray.ToString());
299 
300         }
301 
302         /// <summary>
303         /// 修改Json
304         /// </summary>
305         /// <param name="sender"></param>
306         /// <param name="e"></param>
307         private void btnModifyJson_Click(object sender, EventArgs e)
308         {
309             string json = @"{
310                'channel': {
311                  'title': 'Star Wars',
312                  'link': 'http://www.starwars.com',
313                  'description': 'Star Wars blog.',
314                  'obsolete': 'Obsolete value',
315                  'item': []
316                }
317              }";
318 
319             JObject rss = JObject.Parse(json);
320 
321             JObject channel = (JObject)rss["channel"];
322 
323             channel["title"] = ((string)channel["title"]).ToUpper();
324             channel["description"] = ((string)channel["description"]).ToUpper();
325 
326             channel.Property("obsolete").Remove();
327 
328             channel.Property("description").AddAfterSelf(new JProperty("new", "New value"));
329 
330             JArray item = (JArray)channel["item"];
331             item.Add("Item 1");
332             item.Add("Item 2");
333 
334             this.txtJson.Text=rss.ToString();
335         }
336 
337         /// <summary>
338         /// 合并Json
339         /// </summary>
340         /// <param name="sender"></param>
341         /// <param name="e"></param>
342         private void btnMergeJson_Click(object sender, EventArgs e)
343         {
344             JObject o1 = JObject.Parse(@"{
345                'FirstName': 'John',
346                'LastName': 'Smith',
347                'Enabled': false,
348                'Roles': [ 'User' ]
349              }");
350             JObject o2 = JObject.Parse(@"{
351                'Enabled': true,
352                'Roles': [ 'User', 'Admin' ]
353             }");
354 
355             o1.Merge(o2, new JsonMergeSettings
356             {
357                 // union array values together to avoid duplicates
358                 MergeArrayHandling = MergeArrayHandling.Union
359             });
360 
361             this.txtJson.Text = o1.ToString();
362         }
363 
364         /// <summary>
365         /// 查询Json
366         /// </summary>
367         /// <param name="sender"></param>
368         /// <param name="e"></param>
369         private void btnQueryJson_Click(object sender, EventArgs e)
370         {
371             string json = @"{
372                'channel': {
373                  'title': 'James Newton-King',
374                  'link': 'http://james.newtonking.com',
375                  'description': 'James Newton-King\'s blog.',
376                  'item': [
377                    {
378                      'title': 'Json.NET 1.3 + New license + Now on CodePlex',
379                      'description': 'Annoucing the release of Json.NET 1.3, the MIT license and the source on CodePlex',
380                     'link': 'http://james.newtonking.com/projects/json-net.aspx',
381                     'category': [
382                       'Json.NET',
383                       'CodePlex'
384                     ]
385                   },
386                   {
387                     'title': 'LINQ to JSON beta',
388                     'description': 'Annoucing LINQ to JSON',
389                     'link': 'http://james.newtonking.com/projects/json-net.aspx',
390                     'category': [
391                       'Json.NET',
392                       'LINQ'
393                     ]
394                   }
395                 ]
396               }
397             }";
398 
399             JObject rss = JObject.Parse(json);
400 
401             string rssTitle = (string)rss["channel"]["title"];
402 
403             Console.WriteLine(rssTitle);
404             // James Newton-King
405 
406             string itemTitle = (string)rss["channel"]["item"][0]["title"];
407 
408             Console.WriteLine(itemTitle);
409             // Json.NET 1.3 + New license + Now on CodePlex
410 
411             JArray categories = (JArray)rss["channel"]["item"][0]["category"];
412 
413             Console.WriteLine(categories);
414             // [
415             //   "Json.NET",
416             //   "CodePlex"
417             // ]
418 
419             string[] categoriesText = categories.Select(c => (string)c).ToArray();
420 
421             Console.WriteLine(string.Join(", ", categoriesText));
422             // Json.NET, CodePlex
423         }
424 
425         private void btnQueryWithLinq_Click(object sender, EventArgs e)
426         {
427             string json = @"{
428                'channel': {
429                  'title': 'James Newton-King',
430                  'link': 'http://james.newtonking.com',
431                  'description': 'James Newton-King\'s blog.',
432                  'item': [
433                    {
434                      'title': 'Json.NET 1.3 + New license + Now on CodePlex',
435                      'description': 'Annoucing the release of Json.NET 1.3, the MIT license and the source on CodePlex',
436                     'link': 'http://james.newtonking.com/projects/json-net.aspx',
437                    'category': [
438                       'Json.NET',
439                       'CodePlex'
440                     ]
441                   },
442                   {
443                     'title': 'LINQ to JSON beta',
444                     'description': 'Annoucing LINQ to JSON',
445                     'link': 'http://james.newtonking.com/projects/json-net.aspx',
446                     'category': [
447                       'Json.NET',
448                       'LINQ'
449                     ]
450                   }
451                 ]
452               }
453             }";
454 
455             JObject rss = JObject.Parse(json);
456 
457             var postTitles =
458                 from p in rss["channel"]["item"]
459                 select (string)p["title"];
460 
461             foreach (var item in postTitles)
462             {
463                 Console.WriteLine(item);
464             }
465             //LINQ to JSON beta
466             //Json.NET 1.3 + New license + Now on CodePlex
467 
468             var categories =
469                 from c in rss["channel"]["item"].Children()["category"].Values<string>()
470                 group c by c
471                 into g
472                 orderby g.Count() descending
473                 select new { Category = g.Key, Count = g.Count() };
474 
475             foreach (var c in categories)
476             {
477                 Console.WriteLine(c.Category + " - Count: " + c.Count);
478             }
479             //Json.NET - Count: 2
480             //LINQ - Count: 1
481             //CodePlex - Count: 1
482         }
483 
484         private void btnJsonToXml_Click(object sender, EventArgs e)
485         {
486             string json = @"{
487                '@Id': 1,
488                'Email': 'james@example.com',
489                'Active': true,
490                'CreatedDate': '2013-01-20T00:00:00Z',
491                'Roles': [
492                  'User',
493                  'Admin'
494                ],
495               'Team': {
496                 '@Id': 2,
497                 'Name': 'Software Developers',
498                 'Description': 'Creators of fine software products and services.'
499               }
500             }";
501 
502             XNode node = JsonConvert.DeserializeXNode(json, "Root");
503 
504             this.txtJson.Text=(node.ToString());
505 
506         }
507 
508         private void btnXmlToJson_Click(object sender, EventArgs e)
509         {
510             string xml = @"<?xml version='1.0' standalone='no'?>
511              <root>
512                <person id='1'>
513                <name>Alan</name>
514                <url>http://www.google.com</url>
515                </person>
516                <person id='2'>
517                <name>Louis</name>
518                <url>http://www.yahoo.com</url>
519               </person>
520             </root>";
521 
522             XmlDocument doc = new XmlDocument();
523             doc.LoadXml(xml);
524 
525             string json = JsonConvert.SerializeXmlNode(doc);
526 
527             this.txtJson.Text=json;
528         }
529     }
View Code


备注:

关于Json的功能有很多,这里只是列举了一些基本的例子,其他的功能需要自己在用到的时候去查阅相关文档了。

关于使用说明文档可以去官网【http://www.newtonsoft.com/json】查看。Samples实例的网址如下:http://www.newtonsoft.com/json/help/html/Samples.htm

--------------------------------------------------------------------------------

posted @ 2017-02-23 23:52  老码识途呀  阅读(1476)  评论(0编辑  收藏  举报