ذخیره و اتصال داده ها از طریق فایل JSON در ASP.NET

جمعه 2 بهمن 1394

همانطور که میدانید json یک فرمت ارسال داده ها بین سرور و مشتری است که به آسانترین و کم حجم ترین شکل ارسال داده ها را انجام میدهد. ما در این مقاله قصد داریم چگونگی ذخیره و اتصال داده ها به دیتابیس با استفاده از فایل JSON ، به جای استفاده از پرس و جو ها (Query) را توضیح دهیم.

ذخیره و اتصال داده ها از طریق فایل JSON  در ASP.NET


JSON  پلت فرم مستقل است.گرفتن اطلاعات از پایگاه داده و اتصال آن را به نرم افزار نهایی  ok است اما  بسط دادن یک اتصال  و اتصال برای بازیابی اطلاعات ، بسته به تنظیمات سرور و پردازنده محدود است.
بطور خلاصه json  یک فرمت ارسال داده ها بین سرور و مشتری است که به آسانترین و کم حجم ترین شکل این امر را فراهم میکند.

توضیحات
در زیر روند ذخیره داده ها در فایل Json
و binding نرم افزار نهایی  قرار دارد. در اینجا ما از موارد زیر استفاده کرده ایم:

1. ASP.Net MVC 4

MSSQL 2008 as Database2.

Entity Framework code first approach3.

  From nuget added reference Newtonsoft.json and entity framework4.
 (با استفاده از nuget  ، رفرنسهای Newtonsoft.json و entity framework را به پروژه اضافه میکنیم  )

مرحله 1: Visual studio  2013 را باز کرده و روی New Project کلیک میکنیم.

گام 2: بعد در این پنجره Empty و MVC را انتخاب میکنیم.مانند تصویر زیر:

گام 3: پس از این مرحله در پنجره Solution Explorer روی Solution  راست کلیک ، و گزینه  Add ، پس از آن New Project را انتخاب میکنیم .همانطور که در تصویر زیر میبینید پروزه جدیدی ایجاد میکنیم،

گام 4: بعد از این یک پنجره ظاهر شد،روی Installed کلیک و ویژوال #C، پس از آن Class  را انتخاب و روی OK کلیک میکنیم.

گام 5: Class1 را به Instagram  در  JsonEntity تغییر میدهیم و کد زیر را مینویسیم

public class Instagram  
{  
     [Key] //using System.ComponentModel.DataAnnotations;  
     public int Id { get; set; } // if we will write InstagramId instead of Id [Key] is not required  
     public string InstagramId { get; set; }  
     public string Text { get; set; }  
     public string MediaSharedeUrl { get; set; }  
     public string UserName { get; set; }  
     public string LinkUrl { get; set; }  
     public string MediaType { get; set; }  
     public DateTime CreateDate { get; set; }  
     public DateTime ModifyDate { get; set; }  
     public string Status { get; set; }  
}

بعد از این EntityFramework را از Manage NuGet Packages for solution را اضافه میکنیم.

بعد از این یک پوشه جدید با نام Context و داخل آن یک کلاس با نام JsonContext (این کلاس به عمومی) اضافه میکنیم .

مرحله 6: بعد از این کد زیر را به کلاس JSON Context.cs اضافه کنید ،

public class JsonContext : DbContext //using System.Data.Entity;  
   {  
       public DbSet<Instagram> ObjInstagramDatas { get; set; }    
   } 

 در web.config پروژه Json ، کد زیر را برای ایجاد پایگاه داده و جدول اضافه کنید.

<connectionStrings>  
   <add name="JsonContext" connectionString="Data Source=(local); Initial Catalog=Json; User Id=sa; Password=123" providerName="System.Data.SqlClient"/>  
 </connectionStrings> 

توجه: در اینجا JsonContext را ، برای هر کلاس  context و Initial Catalog=Json را ،اضافه میکنیم.اگر دیتابیس Json Demo وجود نداشته باشد ،آن را ایجاد خواهد کرد.

 solution و dll reference کلاس ،پروژه Json را  build کنید. و  entity framework code first approach این را تکمیل میکند.

مرحله 7: یک Controller به نام Home برای درک بهتر ایجاد کرده و کد زیر را در آن وارد میکنیم . همچنین  Newtonsoft.json از Manage NuGet Packages for solution اضافه میکنیم.

    public class HomeController : Controller    
    {    
        // GET: Home    
        public ActionResult Index()    
        {    
            if (!Directory.Exists(Server.MapPath("~/JsonData")))    
            {    
                Directory.CreateDirectory(Server.MapPath("~/JsonData"));    
                System.IO.File.WriteAllText(Server.MapPath("~/JsonData/InstagramData.json"), null);    
            }  
            var jsonInstagramdata = new StreamReader(Server.MapPath("~/JsonData/InstagramData.json"));    
            var rawJsonData = jsonInstagramdata.ReadToEnd();    
            jsonInstagramdata.Close();    
            var dtlData = JsonConvert.DeserializeObject<List<Instagram>>(rawJsonData); //Get List Of all Data Json File    
            if (dtlData != null)    
            {    
                ViewData["InstagramData"] = dtlData.ToList();    
            }    
            return View();    
        }    
        public ActionResult ReadInstagramRecord()  //This is used to get Instagram records and save data in database.    
        {    
            var count = 0;    
            try    
            {    
                const string hashtag = "ProudToBeIndian"; //getting data from hash tag    
                const string accessToken = "16741082.1b07669.121a338d0cbe4ff6a5e04543158a4f82";    
                var request = (HttpWebRequest)WebRequest.Create("https://api.instagram.com/v1/tags/" + hashtag + "/media/recent?count=33&access_token=" + accessToken + ""); //Hiting API    
                request.Method = "GET";    
                using (var response = (HttpWebResponse)request.GetResponse()) //Saving the json response in database    
                {    
                    var dataStream = response.GetResponseStream();    
                    var reader = new StreamReader(dataStream);    
                    var json = reader.ReadToEnd();    
                    dynamic instagramDataList = JsonConvert.DeserializeObject(json);    
                    foreach (var data in instagramDataList.data)    
                    {    
                        using (var context = new JsonContext()) //Inserting the user details into Db    
                        {    
                            var instagramData = new Instagram();    
      
                            string img = data.type == "image" ? data.images.standard_resolution.url : data.videos.standard_resolution.url;    
                            instagramData.Text = data.caption.text;    
                            instagramData.InstagramId = data.id;    
                            instagramData.UserName = "https://www.instagram.com/" + data.user.username;    
                            instagramData.CreateDate = DateTime.Now;    
                            instagramData.ModifyDate = DateTime.Now;    
                            instagramData.Status = "Approved";    
                            instagramData.MediaType = data.type;    
                            instagramData.MediaSharedeUrl = img;    
                            instagramData.LinkUrl = data.link;    
                            var qry = (from s in context.ObjInstagramDatas where s.InstagramId == instagramData.InstagramId select s).FirstOrDefault();    
                            if (qry != null) continue;    
                            context.ObjInstagramDatas.Add(instagramData);    
                            context.SaveChanges();    
                            count++;    
                        }    
                    }    
      
                    reader.Close();    
                    if (dataStream != null) dataStream.Close();    
                }    
                ViewBag.CountData = count;    
                return RedirectToAction("Index");    
            }    
            catch (Exception ex)    
            {    
                ViewBag.ErrorMessage = "Some exception occured" + ex;    
                return View("Index");    
            }    
        }    
      
        public ActionResult UpdateJson() //Getting data from database and save in Json File    
        {    
            using (var context = new JsonContext())    
            {    
                try    
                {    
                    var getInstaData = context.ObjInstagramDatas.Where(x => x.Status == "Approved").ToList();    
                    var selectInstaData = getInstaData.AsEnumerable().Where(x => x.Status == "Approved").Select((obj, index) => new Instagram()    
                    {    
                        Text = obj.Text,    
                        MediaSharedeUrl = obj.MediaSharedeUrl,    
                        MediaType = obj.MediaType,    
                        Status = obj.Status,    
                        CreateDate = obj.CreateDate,    
                        ModifyDate = obj.ModifyDate,    
                        LinkUrl = obj.LinkUrl,    
                        UserName = obj.UserName,    
                        Id = index + 1    
                    });    
                    var bindInstaData = selectInstaData.ToList();    
      
                    var jsonString = JsonConvert.SerializeObject(bindInstaData);    
                    if (jsonString != null)    
                    {    
                        if (!Directory.Exists(Server.MapPath("~/JsonData")))    
                        {    
                            Directory.CreateDirectory(Server.MapPath("~/JsonData"));    
                        }    
                    }    
                    System.IO.File.WriteAllText(Server.MapPath("~/JsonData/InstagramData.json"), jsonString);    
                    return RedirectToAction("Index");    
                }    
                catch (Exception)    
                {    
                    throw;    
                }    
            }    
        }    
    }   

برای طراحی کد زیر را در Index page پوشه  View وارد میکنیم.

@using JsonEntity  
@{  
    Layout = null;  
    var data = ViewData["InstagramData"];  
}  
  
<!DOCTYPE html>  
  
<html>  
<head>  
    <meta name="viewport" content="width=device-width" />  
    <title>Json Demo</title>  
    <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.10/css/jquery.dataTables.min.css" />  
    <script language="JavaScript" type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>  
</head>  
<body>  
    <div class="col-lg-offset-3 col-md-9">  
        <h4>@Html.ActionLink("Index", "Index", "Home", null, new { @class = "btn btn-success" })    @Html.ActionLink("Fetch Data", "ReadInstagramRecord", "Home", null, new { @class = "btn btn-primary" })     @Html.ActionLink("Update Json", "UpdateJson", "Home", null, new { @class = "btn btn-primary" })</h4>  
    </div>  
    <div>  
        <table id="example" class="display" cellspacing="0" width="100%">  
            <thead>  
                <tr>  
                    <th>Id</th>  
                    <th>Media Shared Url</th>  
                    <th>Media Type</th>  
                    <th>Text</th>  
                    <th>Status</th>  
                </tr>  
            </thead>  
            <tbody>  
                @if (data == null)  
                {  
                    <tr>  
                        <td>  
                            No records to show  
                        </td>  
                    </tr>  
                }  
                else  
                {  
                    foreach (var item in (List<Instagram>)data)  
                    {  
                        <tr>  
                            <td>  
                                @item.Id  
                            </td>  
                            <td>  
                                @if (item.MediaSharedeUrl != null)  
                                {  
                                    if (item.MediaType == "image")  
                                    {  
                                        <a href="@item.MediaSharedeUrl" target="_blank">View Image</a>  
                                    }  
                                    else  
                                    {  
                                        <a href="@item.MediaSharedeUrl" target="_blank">View Video</a>  
                                    }  
                                }  
                                else  
                                {  
                                    <span>Not Available</span>  
                                }  
                                @*<img src="@item.MediaSharedeUrl" style="height:50px;width:50px; " class="img-circle" />*@  
                            </td>  
                            <td>  
                                @item.MediaType  
                            </td>  
                            <td>  
                                @item.Text  
                            </td>  
                            <td>  
                                @item.Status  
                            </td>  
                            @*<td>  
                        <input type="checkbox" class="chcktblInsta" name="chcktblInsta" value="@item.Id" />  
                    </td>*@  
                        </tr>  
                    }  
                }  
            </tbody>  
        </table>  
    </div>  
  
    <script type="text/javascript">  
        $(document).ready(function () {  
            $('#example').DataTable();  
        });  
    </script>  
    <script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.min.js"></script>  
    <script type="text/javascript" src="https://cdn.datatables.net/1.10.10/js/jquery.dataTables.min.js"></script>  
</body>  
</html>  

 

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

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

نویسنده 3355 مقاله در برنامه نویسان

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

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