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 }
其他功能
具体如下图所示【其他功能】:
其他功能代码如下
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': '<h3>Title!</h3>\r\n<p>Content!</p>' 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 }
备注:
关于Json的功能有很多,这里只是列举了一些基本的例子,其他的功能需要自己在用到的时候去查阅相关文档了。
关于使用说明文档可以去官网【http://www.newtonsoft.com/json】查看。Samples实例的网址如下:http://www.newtonsoft.com/json/help/html/Samples.htm
--------------------------------------------------------------------------------
作者:老码识途
出处:http://www.cnblogs.com/hsiang/
本文版权归作者和博客园共有,写文不易,支持原创,欢迎转载【点赞】,转载请保留此段声明,且在文章页面明显位置给出原文连接,谢谢。
关注个人公众号,定时同步更新技术及职场文章