بسم الله الرحمن الرحيم
((رب اشرح لي صدري ويسر لي امري واحلل عقدة من لساني يفقهوا قولي))
JSON using C#.NET Part2
كنا قد شرحنا في الجزء السابق JSON using C#.NET Part1 عن JSON من ناحية التعريف والمعنى والاستخدام وايضا أنوع البيانات المعتمدة فيها.
في هذا الجزء سنوضح كيف تقوم بالتعامل مع ملف JSON بلغة C#.NET من ناحية قراءة ملف JSON من الانترنت وكذلك رفع ملف نص JSON الى الانترنت.
أولا يجب عليك اضافة مكتبة Newtonsoft من NuGet الى المشرع وذلك من خلاله نستطيع التعامل مع ملفات JSON.
هنالك الكثير من المكتبات تستطيع من خلالها التعامل مع JSON لكن نحن سنتعامل مع المكتبة التي ذكرناها سابقا.
أولا: اضافة المكتبة Newtonsoft :
بعد ان تقوم بانشاء مشروع جديد من نوع Console Application اتبع هذه الخطوات لاضافة مكتبة Newtonsoft :
1-
2-
الى الان كل شي تمام. طيب نأتي الى كتابة الاكواد.
ثانيا: قراءة JSON string من الانترنت: سنقوم بقراءة بيانات الطقس من موقع yahoo من خلال ملف JSON من هذا الرابط: Yahoo weather api. ثم سنقوم بنسخ JSON string وتحويله الى Classes.
ثانيا: نقوم بعمل class جديد باتباع هذه الخطوات:
RightClick on project name->Add->Class->Add
ثم قم بمسح:
PHP كود :
class Class1
{
}
بعد مسح اسم الكلاس مع مع الاقواس سيبقى لدينا فقط اسم NameSpace وبداخلها سنقوم بادراج نص JSON على شكل Classes باتباع واحدة من هاتين الخطوتين:
هنالك طريقتين لتحويل نص JSON الى Classes:
1- استخدام موقع http://json2csharp.com
قم بنسخ نص JSON الى الموقع واضغط على Generate ثم انسخ الكلاسات الى داخل الــ NameSpace
أو استخدام هذه الطريقة السهلة والسريعة:
2- من داخل بيئة Visual Studio قم بأتباع الخطوات التالية:
Edit->Paste Special->Paste JSON as Classes
هذه الميزة تأتي فقط في حال كنت قد قمت بتنصيب Web Development اثناء تنصيب الــVisual Studio.
بعد عملية النسخ ستكون شكل الكلاسات داخل الـ NameSpace كالتالي:
PHP كود :
using System;
namespace ReadWriteJSON{
public class Rootobject
{
public Query query { get; set; }
}
public class Query
{
public int count { get; set; }
public DateTime created { get; set; }
public string lang { get; set; }
public Results results { get; set; }
}
public class Results
{
public Channel channel { get; set; }
}
public class Channel
{
public Units units { get; set; }
public string title { get; set; }
public string link { get; set; }
public string description { get; set; }
public string language { get; set; }
public string lastBuildDate { get; set; }
public string ttl { get; set; }
public Location location { get; set; }
public Wind wind { get; set; }
public Atmosphere atmosphere { get; set; }
public Astronomy astronomy { get; set; }
public Image image { get; set; }
public Item item { get; set; }
}
public class Units
{
public string distance { get; set; }
public string pressure { get; set; }
public string speed { get; set; }
public string temperature { get; set; }
}
public class Location
{
public string city { get; set; }
public string country { get; set; }
public string region { get; set; }
}
public class Wind
{
public string chill { get; set; }
public string direction { get; set; }
public string speed { get; set; }
}
public class Atmosphere
{
public string humidity { get; set; }
public string pressure { get; set; }
public string rising { get; set; }
public string visibility { get; set; }
}
public class Astronomy
{
public string sunrise { get; set; }
public string sunset { get; set; }
}
public class Image
{
public string title { get; set; }
public string width { get; set; }
public string height { get; set; }
public string link { get; set; }
public string url { get; set; }
}
public class Item
{
public string title { get; set; }
public string lat { get; set; }
public string _long { get; set; }
public string link { get; set; }
public string pubDate { get; set; }
public Condition condition { get; set; }
public Forecast[] forecast { get; set; }
public string description { get; set; }
public Guid guid { get; set; }
}
public class Condition
{
public string code { get; set; }
public string date { get; set; }
public string temp { get; set; }
public string text { get; set; }
}
public class Guid
{
public string isPermaLink { get; set; }
}
public class Forecast
{
public string code { get; set; }
public string date { get; set; }
public string day { get; set; }
public string high { get; set; }
public string low { get; set; }
public string text { get; set; }
}
}
كما تلاحظون تم تحويل JSON string الى Classes. و بهذه الطريقة سنقوم بعمل DeserializeObject لنفس JSON string الذي سنقوم بقرائته من الويب الى الــ Classes ليسهل التعامل مع عناصر ملف الــ JSON.
1- نأتي الى كود القراءة:
PHP كود :
using System;using Newtonsoft.Json;using System.Net.Http;
namespace ReadWriteJSON{
class Program
{
static void Main(string[] args)
{
var cityName = "kirkuk";
var uri = @"https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22" + cityName + "%2C%20ak%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys";
ReadJson(uri);
Console.ReadKey();
}
async static void ReadJson(string uri)
{
using (HttpClient client = new HttpClient())
{
using (HttpResponseMessage resMessage = await client.GetAsync(uri))
{
using (HttpContent content = resMessage.Content)
{
var jsonString = await content.ReadAsStringAsync();
var jsonObject = JsonConvert.DeserializeObject<Rootobject>(jsonString);
Console.WriteLine(jsonObject.query.results.channel.location.city);
Console.WriteLine(jsonObject.query.results.channel.astronomy.sunrise);
}
}
}
}
}
}
المهم هو هذا السطر:
PHP كود :
var jsonObject = JsonConvert.DeserializeObject<Rootobject>(jsonString);
هنا تم استخدام JsonConvert لعمل DeserializeObject لـ JSON string الى كلاس Rootobject حيث هذا الكلاس يعتبر الكلاس الاب الذي يتضمن على جميع الكلاسات الفرعية.
ومن خلال الــ Classes نستطيع الوصول الى أي Property بسهولة جدا كما هو موضح في سطريْ الطباعة داخل دالة ReadJson.
2- كود رفع بيانات الى الويب على شكل نص JSON:
لنفترض أننا نريد رفع معلومات ل 3 سيارات الى الويب. سنستخدم هذا الموقع http://posttestserver.com/post.php لرفع المعلومات كـ JSON string
سنقوم بانشاء الكلاس التالي:
PHP كود :
class Car
{
public int Id { get; set; }
public string CarName { get; set; }
public int CarPrice { get; set; }
}
ثم نكتب هذه الدالة:
PHP كود :
async static void UploadJson(string uri)
{
var carList = new List<Car>
{
new Car
{
Id=1,
CarName="BMW",
CarPrice=230
},
new Car
{
Id=2,
CarName="rr",
CarPrice=256
},
new Car
{
Id=3,
CarName="t",
CarPrice=266
}
};
using (HttpClient client = new HttpClient())
{
var json = JsonConvert.SerializeObject(carList);
using (HttpContent content = new StringContent(json, Encoding.UTF8, "application/json"))
{
using (HttpResponseMessage resMessage = await client.PostAsync(uri, content))
{
using (HttpContent c = resMessage.Content)
{
var cs = await c.ReadAsStringAsync();
Console.WriteLine(cs);
}
}
}
}
}
أهم نقطة هي في هذا السطر من الكود أعلاه:
PHP كود :
var json = JsonConvert.SerializeObject(carList);
حيث سيتم تحويل المعلومات في carList object الى JSON string.
قمت بطباعة الرسالة الواصلة لي من الويب لذا ستكون الناتج كالتالي:
PHP كود :
Successfully dumped 0 post variables.View it at http://www.posttestserver.com/data/2017/08/10/10.39.101044041893No Post body.
وعند الذهاب الى الرابط الذي ظهر لنا في الناتج سنلاحظ المعلومات كـ JSON string كما في السطر المظلل. طبعا في كل تنفيذ سيختلف الرابط في الناتج.
اتمنى أني وفقت في ايصال المعلومة بصورة صحيحة رغم أني اخترصت الكثير.
ليست هناك تعليقات:
Write Comments