Query زدن روی JSON با استفاده از LINQ
چهارشنبه 28 مهر 1395JSON.Net یک فریمورک فوقالعاده برای کار با داده های JSON است . ما در این مقاله به عملیات های JSON Serialization و JSON Deserialization و کوئری زدن روی داده های JSON با استفاده از LINQ خواهیم پرداخت .
JSON بصورت پیش فرض توسط Net. پشتیبانی نمیشود ، بنابراین ، زمانی که ما از یک زبان Net. همانند #C برای توسعه برنامه های خود استفاده میکنیم ، ما باید از JSON.Net استفاده کنیم . JSON.Net یک فریمورک ، با کارایی بالا از JSON برای Net. است . ما میتوانیم با استفاده از NuGet package Manager منابع مربوط به آن را به References خود اضافه کنیم .
در این مقاله ، ما از پکیج Newtonsoft.JSON برای کار با اعمال JSON Serialization و JSON Deserialization با استفاده از LINQ ، استفاده خواهیم کرد .
ما برنامه را در VS 2015 پیاده سازی خواهیم کرد ، اما شما از VS 2013 هم برای پیاده سازی این برنامه میتوانید استفاده کنید .
مرحله اول : Visual Studio را باز کنید و یک پروژه Console با نام JSON_LINQ_TOJSON ایجاد کنید . با استفاده از NuGet پکیج Newtonsoft.Json را به پروژه اضافه کنید .
مرحله دوم : به پروژه یک کلاس با نام ModelClasses اضافه کنید و کدهای زیر را در آن قرار دهید :
using System.Collections.Generic; namespace JSON_LINQ_TOJSON { public class Course { public int CourseId { get; set; } public string CourseName { get; set; } } public class Student { public int StudentId { get; set; } public string StudentName { get; set; } public string AcadmicYear { get; set; } public List<Course> Courses { get; set; } } public class StudentsDatabase : List<Student> { public StudentsDatabase() { Add(new Student() { StudentId = 1, StudentName = "MS", AcadmicYear = "First", Courses = new List<Course>() { new Course() {CourseId=101,CourseName="C++" }, new Course() {CourseId=102,CourseName="C" }, new Course() {CourseId=103,CourseName="Visual Basic" } } }); Add(new Student() { StudentId = 2, StudentName = "LS", AcadmicYear = "Second", Courses = new List<Course>() { new Course() {CourseId=101,CourseName="C++" }, new Course() {CourseId=104,CourseName="MVC" }, new Course() {CourseId=105,CourseName="AngularJS" } } }); Add(new Student() { StudentId = 3, StudentName = "TS", AcadmicYear = "Third", Courses = new List<Course>() { new Course() {CourseId=102,CourseName="C" }, new Course() {CourseId=104,CourseName="MVC" }, new Course() {CourseId=103,CourseName="Visual Basic" } } }); Add(new Student() { StudentId = 4, StudentName = "VB", AcadmicYear = "First", Courses = new List<Course>() { new Course() {CourseId=101,CourseName="C++" }, new Course() {CourseId=102,CourseName="C" }, new Course() {CourseId=103,CourseName="Visual Basic" } } }); Add(new Student() { StudentId = 5, StudentName = "PB", AcadmicYear = "Second", Courses = new List<Course>() { new Course() {CourseId=104,CourseName="MVC" }, new Course() {CourseId=105,CourseName="AngularJS" }, new Course() {CourseId=106,CourseName="KnockoutJS" } } }); Add(new Student() { StudentId = 6, StudentName = "AB", AcadmicYear = "Third", Courses = new List<Course>() { new Course() {CourseId=101,CourseName="C++" }, new Course() {CourseId=102,CourseName="C" }, new Course() {CourseId=103,CourseName="Visual Basic" } } }); } } public class Employee { public int EmpNo { get; set; } public string EmpName { get; set; } public string DeptName { get; set; } } public class EmployeesDatabase : List<Employee> { public EmployeesDatabase() { Add(new Employee() {EmpNo=1,EmpName="A",DeptName="IT" }); Add(new Employee() { EmpNo = 1, EmpName = "B", DeptName = "Systems" }); Add(new Employee() { EmpNo = 1, EmpName = "C", DeptName = "IT" }); Add(new Employee() { EmpNo = 1, EmpName = "D", DeptName = "Systems" }); Add(new Employee() { EmpNo = 1, EmpName = "E", DeptName = "IT" }); Add(new Employee() { EmpNo = 1, EmpName = "F", DeptName = "Systems" }); } } }
کلاس بالا یک کلاس Student که شامل لیستی از courseها میباشد را تعریف میکند . StudentDatabase نیز مقادیری را در خود ذخیره میکند . این همچنین دارای یک کلاس Employee با EmployeesDatabase و یکسری داده از پیش تعریف شده میباشد :
مرحله سوم : کدهای زیر را در Program.cs قرار دهید :
using System; using System.Linq; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace JSON_LINQ_TOJSON { class Program { static void Main(string[] args) { //1. Get the Data in JSON Serialized Form string StudentsData = JsonConvert.SerializeObject(new StudentsDatabase(),Formatting.Indented); //Console.WriteLine(StudentsData); //2. Convert the JSON string into an Array JArray studentsArray = JArray.Parse(StudentsData); //3. Read all Student Names var resStudents = (from s in studentsArray select s["StudentName"]).ToList(); Console.WriteLine("Only Student Names"); foreach (var item in resStudents) { Console.WriteLine(item.Value<string>().ToString()); } //4. Get only Course Details Console.WriteLine(); var result = (from s in studentsArray.Children()["Courses"] select s).ToList(); Console.WriteLine("Course Details"); foreach (var item in result.Children().ToList()) { Console.WriteLine(item.ToObject<Course>().CourseId + "\t" + item.ToObject<Course>().CourseName); } //5. Get the Data in JSON Serialized Form string employeesData = JsonConvert.SerializeObject(new EmployeesDatabase(), Formatting.Indented); //6. Convert the JSON string into an Array JArray employeesArray = JArray.Parse(employeesData); //7. var empGroupByDeptName = from e in employeesArray group e by e["DeptName"] into deptGroup select new { DeptName = deptGroup.Key, EmpCount = deptGroup.Count() }; Console.WriteLine("Deptrtment \t\t Total Employees Employee"); foreach (dynamic deptGrp in empGroupByDeptName) { Console.WriteLine(deptGrp.DeptName + " \t\t " + deptGrp.EmpCount); } Console.ReadLine(); } } }
کدهای فوق رفتارهای زیر را دارد :
(توجه داشته باشید که ، شماره های زیر با شماره های کامنتهایی که در کد بالا گذاشته شده است هماهنگ است )
1. با استفاده از ()StudentDatabse ، JsonConvert.SerializeObject را در فرمت serialize ، JSON کنید .
2. با استفاده از JArray.Parse ، داده های Student را در آرایه JSON ذخیره کنید .
3. برای خواندن نام تمام Studentها JSON را به LINQ Query متصل سازید . Query نام JToken را در [] مشخص میکند برای مثال : ["StudentName"] .
4. داده های JSON شامل دانش آموزانی است که به عنوان فرزند دارای یک آرایه از Courseها میباشند که دارای یک رابطه یک به چند میباشند . برای خواندن این Query از متد ()Children در مجموعه JToken برای خواندن تمام Courseها استفاده میکنیم . داده های Course ها در Console با تبدیل هر JToken به
Course Object با استفاده از T>ToObject>، نمایش داده میشوند .
5. همانطور که در مورد 1 توضیح داده شد ، داده های Employee به رشته ای از Serialized ، Json میشوند.
6. داده Employee به JArray تبدیل میشود .
7. با استفاده از عبارت GroupBy در هر Department ، تعداد Employeeها محاسبه میشود .
برنامه را اجرا کنید، خروجی زیر را مشاهده خواهید کرد :
همانطور که مشاهده میکنید ، JSON.Net یک روش فوقالعاده برای کار با داده های JSON با استفاده از LINQ میباشد .
- C#.net
- 2k بازدید
- 5 تشکر