آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

استفاده از JSON برای ارسال پارامتر و دریافت اطلاعات binary

AhmadVB  11 سال پیش  11 سال پیش
+2 0

سلام

آیا برای دریافت  اطلاعات و یا ارسال پارامتر های غیر متنی یا به اصلطاح Binary نیز روش JSON مناسب است؟

چه زمانی ممکن است به مشکل بر بخوریم ؟ در صورت پاسخ مثبت راه چاره چیست؟

یکی از کاربردهای این مورد برای من نیاز به Encoding پارامتر ها و امنیت ارتباط و دومی دریافت اطلاعات binary است که در Database سرور ذخیره شده.

متشکر

 برای این سوال 3 پاسخ وجود دارد.
پاسخ به سوال 
hamidd  11 سال پیش
+2 0

بله امکانش هست.می تونید رشته ی JSON رو هر طور که خواستید encode کنید و سمت اندروید decode کنید .وقتی که json به اصطلاح خالص نباشه و کاراکتر های اضافه باهاش ارسال شوند parse کردن JSON  با exception مواجه میشه ( عادی تر بگیم json قابل پردازش نیست). اطلاعات باینری رو هم می تونید با رشته ی JSON دریافت کنید هر کاراکتری میتونه به بایت تبدیل بشود و به عددی در محدوده ی 0 تا 255 تبدیل بشود

پاسخ به سوال 
AhmadVB  11 سال پیش
+1 0

درمورد جایگزینی کاراکترهای رزرو شده در json در دیتای دریافتی، برای اینکه در parser اختلال ایجاد نشود ، آیا این راه حل کارامد است؟

مثلا  بیاییم در دیتای ارسالی از سرور که ممکن دارای کاراکتر های رزرو شده json است، مثل رشته ها در c# کاراکتر های دابل کوتیشن را دوبل کنیم یا قبل از کاراکتر های رزرو شده مثل کروشه و آکولاد بک اسلش بگذاریم.

آیابا این کار  مشکل  parser حل می شود؟

 

 

+1 0
منظورتون رو از کاراکتر های رزرو شده متوجه نشدم. باید محتوای کلید ها کد گذاری بشه پس دلیلی نداره که توی تجزیه کردن رشته ی JSON مشکلی پیش بیاد (وقتی JSON رو به اصطلاح خالص تولید کنید و فقط محتوای کلید ها رمز کد شده باشه) . بعد اگه بخواهید می تونید در مرحله ی بعد کل رشته JSON رو کد کنید، می تونید هم کد نکنید. (11 سال پیش)
+2 0
منظورم اینه که اگر توی متنی که درون محتوای کلیدها هستند کاراکترهای [] {} یا " وجود داشته باشه چی میشه؟ باعث خراب شدن json نمیشه؟ خودمون باید حواسمون باشه که همچین کاراکتر هایی توش نباشه یا توابع تبدیل آرایه به json خودشون یک کاری اش می کنند! نمی دونم منظورم رو متوجه شدید یا نه. (11 سال پیش)
پاسخ به سوال 
hamidd  11 سال پیش
+2 0

الان متوجه منظورتون شدم.
سوال: آیا برای دریافت  اطلاعات و یا ارسال پارامتر های غیر متنی یا به اصلطاح 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 میشه.

+1 0
بسیار عالی بود. متشکرم. فقط یک مورد اینکه حدس می زنم اگر تنها کاراکتر " را به همین روش اصلاح کنیم برای سایر کاراکتر های رزرو شده مشکلی پیش نیاید چون غالبا پارسر ها به کاراکتر های درون یک رشته تازمانی که به انتهای رشته نرسند اهمیت نمی دهند. درسته ؟ (11 سال پیش)
+1 0
خواهش می کنم. نه کاراکتر های دیگه ای مثل \ هم وجود داره که باید اون ها رو هم escape کرد. مثلا این طوری میشه \\ (11 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .