استفاده از JSON برای ارسال پارامتر و دریافت اطلاعات binary
سلام
آیا برای دریافت اطلاعات و یا ارسال پارامتر های غیر متنی یا به اصلطاح Binary نیز روش JSON مناسب است؟
چه زمانی ممکن است به مشکل بر بخوریم ؟ در صورت پاسخ مثبت راه چاره چیست؟
یکی از کاربردهای این مورد برای من نیاز به Encoding پارامتر ها و امنیت ارتباط و دومی دریافت اطلاعات binary است که در Database سرور ذخیره شده.
متشکر
بله امکانش هست.می تونید رشته ی JSON رو هر طور که خواستید encode کنید و سمت اندروید decode کنید .وقتی که json به اصطلاح خالص نباشه و کاراکتر های اضافه باهاش ارسال شوند parse کردن JSON با exception مواجه میشه ( عادی تر بگیم json قابل پردازش نیست). اطلاعات باینری رو هم می تونید با رشته ی JSON دریافت کنید هر کاراکتری میتونه به بایت تبدیل بشود و به عددی در محدوده ی 0 تا 255 تبدیل بشود
درمورد جایگزینی کاراکترهای رزرو شده در json در دیتای دریافتی، برای اینکه در parser اختلال ایجاد نشود ، آیا این راه حل کارامد است؟
مثلا بیاییم در دیتای ارسالی از سرور که ممکن دارای کاراکتر های رزرو شده json است، مثل رشته ها در c# کاراکتر های دابل کوتیشن را دوبل کنیم یا قبل از کاراکتر های رزرو شده مثل کروشه و آکولاد بک اسلش بگذاریم.
آیابا این کار مشکل parser حل می شود؟
الان متوجه منظورتون شدم.
سوال: آیا برای دریافت اطلاعات و یا ارسال پارامتر های غیر متنی یا به اصلطاح Binary نیز روش JSON مناسب است؟
در کل JSON به خاطر استاندارد بودنش و به خاطر این که parcelable میشه، استفاده میشه. برای قرار دادن اطلاعات باینری در قالب رشته که شامل کاراکتر هایی مانند " هم باشه، مناسب هست ولی چون یه جورایی نیاز به پردازش اضافه داریم شاید بشه گفت از نظر الگوریتمی بهینه نیست. ولی راه حل داره.
چه زمانی ممکن است به مشکل بر بخوریم ؟
وقتی مثلا اگه یکی از کلیدهامون رشته باشه و بخواهیم داخل محتواش علامت " باشه. JSON قابل پردازش نیست و exception رخ میده.
مثالی از رشته ی JSON صحیح و قابل پردازش:
{ "action": "test" }
مثالی از رشته ی JSON غیر قابل پردازش:
{ "action": "te"st" }
یعنی بدون escape کردن کاراکتر " به صورت "\ قابل پردازش نیست.
در صورت پاسخ مثبت راه چاره چیست؟
راه حل زیاد وجود داره. یک راه اینه که میتونیم کاراکتر های خاص مثل " رو با گذاشتن علامت \ قبل از کاراکتر مورد نظر escape کنیم.
یعنی به جای :
{ "action": "te"st" }
مینویسیم :
{ "action": "te\"st" }
در محتوای کلید به جای علامت " از "\ استفاده می کنیم و مشکلی در تجزیه ی json پیش نمیاد و وقتی محتوای کلیدمون که از نوع رشته هست رو از json می خونیم عبارت \ حذف میشه و فقط علامت " باقی میمونه ( برای بقیه ی کاراکتر های رزرو شده هم به همین صورت عمل می کنیم ).
سوال : حالا اگه بخواهیم عبارت te"st (همون مثال بالا) رو به عنوان محتوای کلیدی که از نوع رشته هست بزاریم یک مثال کدنویسی هم ازش قرار بدید (این سوال رو دیگه شما نپرسیدی از خودم در آوردم D: ) ؟
خوب این جا کدی ساده برای همون مثال خیلی ساده ی بالا مینویسیم :
String jsonString = "{ \"action\": \"te\\\"st\" }";
JSONObject object = null;
String action = "";
try {
object = new JSONObject(jsonString);
action = object.getString("action");
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
خوب بعد از اجرای کد بالا به مقدار محوای کلید action که te"st می باشد دسترسی پیدا کردیم و مشکلی هم به وجود نیامد. مقدار رشته ی action بعد از اجرای کد بالا برابر با te"st میشه.
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .