برای طرح سوال و دسترسی به آموزش ها  کانال ما در تلگرام بپویندید  

JSON چیست و نحوه استفاده آن در دلفی Delphi و پی اچ پی PHP

سلام

به سایت 4xmen خوش آمدید بازم باعث افتخار منه که پیش عزیزان دیگه این سایت دارم فعالیت می کنم.

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

اما Javascript چون یه زبان اسکریپت نویسی هستش و مستقل برای خودش عمل نمی کنه یعنی سمت کلاینت (کاربر) هستش برای همین نیاز شدیدی داره که با زبان های سمت سرور ارتباط برقرار کنه از همین رو یه استاندارد جدید هم عرضه شد به نام JSON تعریف JSON طبق اونچه سایت مرجعش نوشته:

جي‌سان يا JSON (JavaScript Object Notation) يك فرمت تبادل داده سبك (lightweight) مي‌باشد كه خواندن و نوشتن آن براي انسان و توليد و پارس كردن آن براي ماشين‌ها آسان است. اين زبان بر مبناي يك زير مجموعه از زبان برنامه‌نويسي JavaScript ، استاندارد ECMA-262 ويرايش سوم – دسامبر 1999‌، است. JSON بصورت متني (text) بوده و كاملاً مستقل از زبان بكار رفته است، اما از قوانيني استفاده مي‌كند كه براي برنامه‌نويسان زبان‌هاي خانواده C (شامل C ، C++ ، Java ، JavaScript ، Perl ، Python ، و بسياري زبان‌هاي ديگر) آشنا مي‌باشد.‌ اين خصوصيات JSON را يك زبان تبادل‌داده‌اي ايده‌آل كرده است.

JSON بر اساس دو ساختار ساخته شده:

  • يك مجموعه از زوج‌هاي نام/ارزش (name/value). در زبان‌هاي گوناگون اين ساختار يك شيء (object) ، ساختار (struct) ، ديكشنري (dictionary) ، جدول مخلوط (hash table) ، ليست كليددار (keyed list) يا آرايه انجمني (associative array) شناخته مي‌شود. • يك ليست منظم از ارزش‌ها. در بسياري از زبان‌ها اين ساختار يك آرايه ( array) ، بردار (vector) ، ليست (list) ، يا دنباله (sequence) شناخته مي‌شود.
  • اينها ساختار داده‌هاي عمومي هستند. همه زبان‌هاي برنامه‌نويسي مدرن يكي از آنها را پشتيباني مي‌كنند. منطقي است كه يك فرمت داده قابل استفاده توسط زبان‌هاي برنامه‌نويسي مختلف بر مبناي اين ساختارها باشد.

در JSON از فرم‌هاي زير استفاده مي‌شود:

يك شيء (object) يك مجموعه نامنظم از زوج‌هاي نام/ارزش است. يك object‌ با { (آكولاد باز) شروع، و با } (آكولاد بسته) تمام مي‌شود. در انتهاي هر نام يك : (دو نقطه) قرار مي‌گيرد و زوج‌هاي نام/ارزش با , (ويرگول) جدا مي‌شوند.

object (1)

 

يك array يك مجموعه (collection) منظم از ارزش‌ > (value) ها است. يك array با [ (براكت باز) شروع، و با > ] (براكت بسته) تمام مي‌شود. ارزش‌ها توسط , (ويرگول) از هم جدا مي‌شوند.

array

 

يك value مي‌تواند يك رشته (string) داخل  ، يا يك عدد ، يا true يا false يا null ، يا يك object يا يك array باشد. اين ساختارها مي‌توانند تو در تو باشند.

value

 

خب این توضحاتش بودش برای توضحات تکمیلی به این آدرس مراجعه کنید.

اما چطور از JSON استفاده کنیم.

PHP

ابتدا در مورد PHP توضیح میدیم چون هم ساده تر هستش و هم Open Source هستش.

در php استفاده JSON بسیار ساده هستش چون PHP از associative array پشتیبانی کامل داره حالا شاید براتون سوال بشه associative array چیست به زبان ساده تو یک جمله بخوایم توضیح بدیم این هستش که در آرایه های php در key ها ما فقط مجبور به استفاده از عدد نیستیم و به سادگی میتونیم حتی string هم به عنوان کلید آرایه در نظر بگیریم و حالا برای استفاده از JSON زمانی که ما آرایه ای رو می خوایم به رشته تبدیل کنیم و JSON کنیم به سادگی به یه خط کد امکان پذیر هستش برای مثال:

<?php

	$arr = array();
	$arr['key1'] = 'hello' ;
	$arr['key2'] = 'world';
	$arr['key3'] = array();
	$arr['key3'][1] = 'test' ;
	$arr['key3'][2] = true ;
	$arr['key4'] = 12 ;

	echo json_encode($arr);
?>

خب کد بالا اول ما آرایه رو تعریف می کنیم و بعد با تابع  json_encode در پاسخ به ما :

{"key1":"hello","key2":"world","key3":{"1":"test","2":true},"key4":12}

رو میده و برعکس تبدیل string json به برعکس با تابع json_decode به شکل زیر :

<?php

	$str = '{"key1":"hello","key2":"world","key3":{"1":"test","2":true},"key4":12}' ;
	print_r( json_decode($str) );
?>

ونتیجه مانند زیر میشه :

stdClass Object ( [key1] => hello [key2] => world [key3] => stdClass Object ( [1] => test [2] => 1 ) [key4] => 12 )

 

Delphi

حالا نوبتی هم باشه نبوت به دلفی میرسه در دلفی با وجود عدم پشتیبانی از آرایه های associative به صورت مستقیم و عدم پشتیبانی مستقیم از کتابخانه استفاده کنیم از کتابخانه های زیادی من خودم استفاده کردم از جمله superObject و dwsJSON که یکی از یکی پر درد سر تر بودند و عمر ما تلف شد تا به نتیجه فعلی برسیم که کتابخانه ایده آل چیست و اون رو معرفی می کنیم خدمتتون:

کتباخانه LkJSON کتابخانه فوق العاده ای هستش که روی تمام ورژن های دلفی هم جواب میده و برای دانلود یا سرچ کنید و یا به آخر همین نوشته مراجعه کنید این نوشته در زمان نسخه   LkJSON v1.07 این کتابخانه و Delphi XE5 نگاشته شده است و برای استفاده از این به شکل ساده از مثال های خودش استفاده می کنیم برای تبدیل سری متغییر ها به JSON این روش کار سازه البته با فراخونی کتابخانه دانلود شده :

var
  js:TlkJSONobject;
  ws: TlkJSONstring;
  s: String;
  i: Integer;
begin
  js := TlkJSONobject.Create;
//  js.add('namestring', TlkJSONstring.Generate('namevalue'));
  js.Add('namestring','namevalue');
// get the text of object
  s := TlkJSON.GenerateText(js);
  writeln(s);
  writeln;
  writeln('more readable variant:');
// (ver 1.03+) generate readable text
  i := 0;
  s := GenerateReadableText(js,i);
  writeln(s);

  js.Free;
// restore object (parse text)
  js := TlkJSON.ParseText(s) as TlkJSONobject;
// and get string back
// old syntax
  ws := js.Field['namestring'] as TlkJSONstring;
  s := ws.Value;
  writeln(s);
// syntax of 0.99+
  s := js.getString('namestring');
  writeln(s);

  readln;
  js.Free;
end.

روند کار کد مشخص هستش ما از کلاس TlkJSONobject  یک نسخه می سازیم و سپس با تابع add خانه بهش اضافه می کنیم، و کد ها کامنت دارند و کاملا مشخص هستند واما برای برعکس این ماجرا نیاز هستش شما به کد زیر توجه کنید:

 

var
  js,xs:TlkJSONobject;
  ws: TlkJSONstring;
  s: String;
  i: Integer;
begin
  s := '{"string1":"123","string2":"two",'+
    '"childobject":{"objstr1":"Oone","objstr2":"Otwo"}}';
  writeln(s);
// restore object (parse text)
  js := TlkJSON.ParseText(s) as TlkJSONobject;
  writeln('parent self-type name: ',js.SelfTypeName);
// how to obtain type of child
  if not assigned(js) then
    begin
      writeln('error: xs not assigned!');
      readln;
      exit;
    end
  else
    begin
      if js.Field['childobject'] is TlkJSONnumber then writeln('type: xs is number!');
      if js.Field['childobject'] is TlkJSONstring then writeln('type: xs is string!');
      if js.Field['childobject'] is TlkJSONboolean then writeln('type: xs is boolean!');
      if js.Field['childobject'] is TlkJSONnull then writeln('type: xs is null!');
      if js.Field['childobject'] is TlkJSONlist then writeln('type: xs is list!');
      if js.Field['childobject'] is TlkJSONobject then writeln('type: xs is object!');
    end;
// the other way (0.93+)
  case js.Field['childobject'].SelfType of
    jsBase : writeln('other type: xs is base');
    jsNumber : writeln('other type: xs is number');
    jsString : writeln('other type: xs is string');
    jsBoolean : writeln('other type: xs is boolean');
    jsNull : writeln('other type: xs is null');
    jsList : writeln('other type: xs is list');
    jsObject : writeln('other type: xs is object');
  end;
  writeln('self-type name: ',js.Field['childobject'].SelfTypeName);
// and get string back
  xs := js.Field['childobject'] as TlkJSONobject;
// we know what xs chilren are strings
  ws := xs.Field['objstr1'] as TlkJSONstring;
  writeln(ws.value);
  ws := xs.Field['objstr2'] as TlkJSONstring;
  writeln(ws.value);
// new v0.99+ syntax!
  writeln(xs.getString('objstr1'));
  writeln(xs.getString('objstr2'));
// for 1.04+ syntax
  s := vartostr(js.Field['childobject'].Field['objstr1'].Value);
  writeln(s);
  s := vartostr(js.Field['childobject'].Field['objstr2'].Value);
  writeln(s);
//
  readln;
  js.Free;
end.

در کد بالا ما رشته JSON رو داریم و با کد :

  js := TlkJSON.ParseText(s) as TlkJSONobject;

اون رو آماده می کنیم و با روش زیر خانه های آن رو بدست میاریم و داخل یک متغییر از نوع TlkJSONstring میریزم تا قابل نمایش باشه:

ws := xs.Field['objstr2'] as TlkJSONstring;

به همین سادگی و به همین خوشمزگی متونید نمایشش بدین:

writeln(ws.value);

خب امیدوارم که بار دیگر 4xmen تنوسته باشه به شما کمک کنه فایل هاش رو دانلود کنید و اولین مثال JSON خودتون رو بنویسید:

lkJSON-1.07


انتشار

در

, ,

توسط

برچسب‌ها:

نظرات

5 پاسخ به “JSON چیست و نحوه استفاده آن در دلفی Delphi و پی اچ پی PHP”
  1. HamiD نیم‌رخ

    خیلی کارخوبی کردی که دلفی و php رو جفت باهم گفتی :دی

    1. Mahdiam نیم‌رخ
      Mahdiam

      C# and ASP.net باشه Delphi با PHP میشه دیگه 😀

  2. مهدي كريم پور نیم‌رخ
    مهدي كريم پور

    با عرض سلام خدمت دوستان
    بايد بگم كه در حال حاضر دلفي از JSON به صورت رسمي پشتيباني مي كند. مجموعه كلاس ‌هاي مرتبط رو مي تونيد در فضاي نام Data.DBXJSON پيدا كنيد.

    با تشكر

  3. سعیدرجایی نیم‌رخ
    سعیدرجایی

    {
    “Id”: “1”,
    “Name”: “پودر ماشین لباسشویی طلایی”,
    “CategoryId”: “1”,
    “Asset”: “300”,
    “Price”: “6500”,
    “CustomerPrice”: “6300”,
    “Tags”: “پودر،لباسشویی،پاکشوما”,
    “InBox”: “12”,
    “Code”: “456231”,
    “Image”: “p1.png”,
    “Min”: “20”,
    “IsDelete”: “0”
    },
    {
    “Id”: “2”,
    “Name”: “پودر دستی 200 گرمی”,
    “CategoryId”: “1”,
    “Asset”: “450”,
    “Price”: “5300”,
    “CustomerPrice”: “5000”,
    “Tags”: “پودر،دستی”,
    “InBox”: “12”,
    “Code”: “456232”,
    “Image”: “p2.png”,
    “Min”: “24”,
    “IsDelete”: “0”
    },
    {
    “Id”: “3”,
    “Name”: “مایع دستشویی کوچک”,
    “CategoryId”: “1”,
    “Asset”: “200”,
    “Price”: “7200”,
    “CustomerPrice”: “7100”,
    “Tags”: “مایع،دستشویی”,
    “InBox”: “6”,
    “Code”: “456233”,
    “Image”: “p3.png”,
    “Min”: “12”,
    “IsDelete”: “0”
    },
    {
    “Id”: “4”,
    “Name”: “همبرگر 60 درصد 5 عددی”,
    “CategoryId”: “2”,
    “Asset”: “140”,
    “Price”: “9500”,
    “CustomerPrice”: “9200”,
    “Tags”: “همبرگر،کاله”,
    “InBox”: “10”,
    “Code”: “300150”,
    “Image”: “p4.png”,
    “Min”: “10”,
    “IsDelete”: “0”
    },
    {
    “Id”: “5”,
    “Name”: “بستنی 1 لیتری وانیلی”,
    “CategoryId”: “2”,
    “Asset”: “500”,
    “Price”: “4200”,
    “CustomerPrice”: “4000”,
    “Tags”: “بستنی،بزن،کاله”,
    “InBox”: “6”,
    “Code”: “300151”,
    “Image”: “p5.png”,
    “Min”: “6”,
    “IsDelete”: “0”
    },
    {
    “Id”: “6”,
    “Name”: “پفک موتوری بزرگ”,
    “CategoryId”: “3”,
    “Asset”: “200”,
    “Price”: “2000”,
    “CustomerPrice”: “1800”,
    “Tags”: “پفک،موتوری،چی توز”,
    “InBox”: “6”,
    “Code”: “300152”,
    “Image”: “p6.png”,
    “Min”: “7”,
    “IsDelete”: “0”
    },
    {
    “Id”: “7”,
    “Name”: “چیپس سرکه ای”,
    “CategoryId”: “3”,
    “Asset”: “300”,
    “Price”: “2200”,
    “CustomerPrice”: “2000”,
    “Tags”: “چیپس”,
    “InBox”: “12”,
    “Code”: “300153”,
    “Image”: “p7.png”,
    “Min”: “1”,
    “IsDelete”: “0”
    }
    من همچین مجموعه ای دارم چگونه پیمایش کنم در دلفی برای خواندن آن

  4. ابرهیم قائمی نیم‌رخ

    سلام ممنون فقط کاربردش رو هم بزارید خیلی خوب میشه مخصوصا API

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *