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
- 3k بازدید
- 5 تشکر