Query زدن روی JSON با استفاده از LINQ

چهارشنبه 28 مهر 1395

JSON.Net یک فریمورک فوق‌العاده برای کار با داده های JSON است . ما در این مقاله به عملیات های JSON Serialization و JSON Deserialization و کوئری زدن روی داده های JSON با استفاده از LINQ خواهیم پرداخت .

 Query زدن روی 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 میباشد . 

آموزش سی شارپ

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 2k بازدید
  • 5 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید