کدنگار

وبلاگ شخصی-آموزشی علی رشیدی

کدنگار

وبلاگ شخصی-آموزشی علی رشیدی

طبقه بندی موضوعی
پیوندهای روزانه
پیوندها

پردازش، ارسال درخواست و دریافت جیسون در کیوت

دوشنبه, ۲۰ شهریور ۱۳۹۶، ۱۲:۳۳ ب.ظ

حدود یک ماه است که روی پروژه ای که بند بند وجودش به پردازش جیسون و محلی سازی است کار میکنم، تا حالا تجربه های کوچکی را با شما به اشتراک گذاشتم و حالا میخواهم در این مطلب، ارسال درخواست، ذخیره نتیجه، پردازش و محلی سازی جیسون را به وسیله اشیا توضیح بدهم.


ارسال درخواست و دریافت نتیجه

برای ارسال درخواست، تست شده ترین و ساده ترین روش به شرح زیر است:


  • ایجاد یک شی QNetworkAccessManager، QNetworkRequest و QNetworkReply
  • QNetworkAccessManager برای ارسال درخواست
  • QNetworkRequest درخواستی است که به شی قبل میدهیم.
  • QNetworkReply هم پاسخ یک درخواست را نگهداری میکند.
  • تنظیم مشخصات request و ارسال، برابر قرار دادن reply با شی بازگشت داده شده توسط request.
  • یک QEventLoop را اجرا میکنیم، این حلقه تا زمانی که اسلات quit آن صدا زده نشود برنامه را متوقف میکند.
  • سیگنال finished از request را به این اسلات وصل میکنیم، تا هنگامی که درخواست کامل شد (پاسخ کامل دریافت شد) از حلقه خارج شویم.
در نهایت ما یک شی از نوع QNetworkReply داریم که میتوانیم نتیجه درخواست را از آن بخوانیم.

//Files to include
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QEventLoop>
#include <QObject>
#include <QUrl>

//Example code
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QNetworkRequest request;
QNetworkReply *reply;
QEventLoop loop;

connect(manager, SIGNAL(finished(QNetworkReply*)), &loop, SLOT(quit()));

request.setUrl(QUrl("Where we receive JSON from"));
reply = manager->get(request);
loop.exec();

پردازش جیسون

ایجاد سند

حالا که نتیجه درخواست را دارید (که قطعا یک جیسون معتبر باید باشد) میتوانید آنرا پردازش کنید. اولین قدم، ایجاد یک شی از نوع QJsonDocument است. برای اینکار از متد استاتیک fromJson این شی استفاده میکنیم.


نکته: متد استاتیک، متدی است که بدون اینکه یک شی ایجاد شده باشد قابل دسترسی است.


روش ایجاد یک سند با استفاده از نتیجه درخواست:

QJsonDocument doc = QJsonDocument::fromJson(reply->readAll());
if (doc.isNull())
qDebug() << "Unable to load JSON or invalid JSON document";

متد isNull بررسی میکند که سند ایجاد شده یا خیر. اگر ایجاد نشده باشد، ممکن است اصلا اطلاعات دریافت نشده باشد یا اینکه اطلاعات دریافتی دارای مشکل باشد.


کار با اشیا

من فرض را بر این میگیرم که ساختار جیسون را میدانید. کیوت برای اشیا جیسون کلاسی دارد به اسم QJsonObject. این کلاس میتواند یک شیئ را نگهداری کند.

اگر میخواهید راحت تر جیسون را پردازش کنید، بهتر است به صورت شی یا آرایه به آن دسترسی پیدا کنید. اگر میدانید ریشه سند شما یک شی است، به این صورت عمل کنید:

QJsonObject obj = doc.object();

توجه کنید که اگر ریشه سند آرایه باشد شی ایجاد شده تهی است.

حالا میخواهیم به یک کلید از سند دسترسی پیدا کنیم، اینکار با استفاده از براکت ها انجام میشود. مثلا اگر شی ما یک کلید به اسم name دارد به صورت زیر قابل دسترسی است:

obj["name"]

اما این داده نمیتواند به تنهایی کاری برای ما انجام دهد چرا که از نوع QJsonValue است. برای تبدیل آن به شی مناسب از متد های توضیح داده شده در مستندات کیوت، مربوط به QJsonValue استفاده کنید. مثلا ما میدانیم که نام یک رشته است، پس اینگونه آنرا مورد استفاده قرار میدهیم:

qDebug() << obj["name"].toString();
//Outputs "Ali"

کار با آرایه ها

برای دسترسی به هر عضو آرایه از متد at استفاده میکنیم. این متد هم یک QJsonValue برمیگرداند که کار تبدیل را راحت میکند.

مثلا اینجا یک عضو آرایه را به عنوان شی استفاده میکنیم:

/*Our JSON is:
[{"name":"Ali","age":18},{"name":"Sina","age":21}]
and is stored in arr
*/

QJsonObject aliObject = arr.at(0).toObject();
qDebug() << aliObject["name"];
//Outputs "Ali"

مثال بزرگتر

در مطلب بعدی یک مثال خواهم گذاشت که در آن خواندن جیسون از فایل، محلی سازی، نوشتن در فایل و ... انجام شده و برای مطالعه عالی میباشد.

  • علی رشیدی

جیسون

کیوت

نظرات (۰)

هیچ نظری هنوز ثبت نشده است
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی