نحوه ارسال و تجزیه داده های JSON در Golang – رمزگذاری و رمزگشایی داده ها با مثال توضیح داده شده است
هنگام ساخت برنامه های وب در Golang، کار با داده های JSON اجتناب ناپذیر است. چه در حال ارسال پاسخ به کلاینتها یا تجزیه درخواستها باشید، رمزگذاری و رمزگشایی JSON مهارتهای ضروری برای تسلط هستند.
در این مقاله، روشهای مختلف رمزگذاری و رمزگشایی JSON در Golang را تحلیل خواهیم کرد.
فهرست مطالب
نحوه ارسال پاسخ های JSON (رمزگذاری)
نحوه استفاده از تابع Marshal برای رمزگذاری JSON
نحوه استفاده از تابع NewEncoder
نحوه تجزیه درخواست های JSON (رمزگشایی)
نحوه استفاده از تابع Unmarshal برای تجزیه درخواست های JSON
نحوه استفاده از تابع NewDecoder برای رمزگشایی JSON
سفارشی JSON Marshaling و Unmarshaling
نحوه استفاده از JSON Marshaler
نحوه استفاده از JSON Unmarshaler
از موارد و توصیه ها استفاده کنید
نحوه ارسال پاسخ های JSON (رمزگذاری)
رمزگذاری JSON فرآیند تبدیل ساختارهای داده Go به فرمت JSON است.
رمزگذاری به فرآیند تبدیل داده ها از یک فرمت به فرمت دیگر اشاره دارد. در زمینه محاسبات و انتقال داده، رمزگذاری معمولاً شامل تبدیل داده ها به یک قالب استاندارد است که می تواند به راحتی توسط سیستم ها یا برنامه های مختلف ذخیره، انتقال یا پردازش شود.
به رمزگذاری مانند بستن چمدان برای سفر فکر کنید. شما لباسهای خود را (دادهها) میگیرید و آنها را در یک چمدان (فرمت رمزگذاریشده) بستهبندی میکنید تا به راحتی در مقصد حمل و نقل (انتقال) و بازگشایی (رمزگشایی) شوند.
در مورد رمزگذاری JSON، داده ها به یک قالب متنی تبدیل می شوند که از کاراکترهای قابل خواندن توسط انسان برای نمایش داده ها استفاده می کند. این امر خواندن و درک داده ها را برای انسان آسان می کند و همچنین سیستم های مختلف را برای تبادل و پردازش داده ها آسان می کند.
برخی از دلایل رایج برای رمزگذاری داده ها عبارتند از:
فشرده سازی داده ها: کاهش اندازه داده ها به منظور ذخیره سازی یا انتقال آسان تر.
امنیت داده ها: محافظت از داده ها در برابر دسترسی یا دستکاری غیرمجاز.
سازگاری داده ها: تبدیل داده ها به قالبی که توسط سیستم ها یا برنامه های مختلف قابل خواندن و پردازش باشد.
انتقال داده: تبدیل داده ها به قالبی که به راحتی از طریق شبکه یا کانال های ارتباطی دیگر قابل انتقال باشد.
در Golang می توانیم از بسته encoding/json
برای رمزگذاری داده های JSON استفاده کنیم.
نحوه استفاده از تابع Marshal برای رمزگذاری JSON
تابع Marshal
متداول ترین روش مورد استفاده برای رمزگذاری داده های JSON در Golang است. یک ساختار داده Go را به عنوان ورودی می گیرد و یک رشته رمزگذاری شده با JSON را برمی گرداند.
دیگر اخبار
از کانی چان تا اتان کورزویل، سرمایه گذاران خطرپذیر همچنان به نواختن صندلی های موسیقی ادامه می دهند.
توضیح کد:
واردات:
encoding/json
: توابعی را برای رمزگذاری و رمزگشایی JSON ارائه می دهد.
fmt
: برای خروجی چاپ.
ساختار کاربر:
یک ساختار User
را با فیلدهای Name
و Age
تعریف می کند.
تگ های Struct (به عنوان مثال: json:"name"
) نام کلیدهای JSON را مشخص می کنند.
عملکرد اصلی:
یک نمونه User
ایجاد می کند.
json.Marshal
را فراخوانی می کند تا ساختار user
را در JSON کدگذاری کند. این یک تکه بایت و یک خطا را برمی گرداند.
اگر خطایی وجود نداشته باشد، برش بایت را به یک رشته تبدیل می کند و آن را چاپ می کند.
نحوه استفاده از تابع NewEncoder
تابع NewEncoder
برای رمزگذاری داده های JSON به یک نویسنده، مانند یک فایل یا اتصال شبکه، استفاده می شود.
بیشتر بخوانید
اتحادیه اروپا توجه خود را به پلتفرم های بزرگتر برای دسترسی به داده ها برای تحقیقات ریسک جلب می کند
توضیح کد:
داخل هندلر:
تابع handler
یک کنترل کننده HTTP است که درخواست های HTTP ورودی را مدیریت می کند.
w http.ResponseWriter
: برای نوشتن پاسخ استفاده می شود.
r *http.Request
: نشان دهنده درخواست ورودی است.
یک نمونه Person
به نام person
ایجاد و با مقادیر Name: "John"
و Age: 30
مقداردهی اولیه شد.
یک رمزگذار JSON با استفاده از json.NewEncoder(w)
ایجاد شد که خروجی JSON را در پاسخ نویس w
می نویسد.
ساختار person
به JSON کدگذاری شد و با استفاده از encoder.Encode(person)
روی پاسخ نوشته شد.
اگر خطایی در حین رمزگذاری رخ دهد، به عنوان یک پاسخ خطای HTTP با کد وضعیت 500 Internal Server Error
به مشتری ارسال می شود.
نحوه تجزیه درخواست های JSON (رمزگشایی)
رمزگشایی JSON فرآیند تبدیل داده های JSON به ساختارهای داده Go است.
رمزگشایی به فرآیند تبدیل داده ها از فرمت استاندارد شده به شکل اصلی آن اشاره دارد. در محاسبات و انتقال داده، رمزگشایی شامل گرفتن داده های رمزگذاری شده و تبدیل آن به قالبی است که به راحتی توسط یک سیستم یا برنامه خاص قابل درک و پردازش باشد.
به رمزگشایی فکر کنید مانند باز کردن چمدان بعد از سفر. چمدان بسته بندی شده (داده های رمزگذاری شده) را می گیرید و آن را باز می کنید و هر مورد (داده ها) را به جای اصلی خود برمی گردانید تا بتوانید دوباره از آن استفاده کنید.
در مورد رمزگشایی JSON، دادههای JSON مبتنی بر متن به شکل اصلی خود، مانند ساختار داده Go (مانند ساختار یا برش) تبدیل میشوند تا به راحتی توسط برنامه قابل دسترسی و پردازش باشد.
برخی از دلایل رایج برای رمزگشایی داده ها عبارتند از:
استخراج داده ها: بازیابی داده های خاص از مجموعه داده های رمزگذاری شده بزرگتر.
تجزیه و تحلیل داده ها: تبدیل داده های رمزگذاری شده به قالبی که به راحتی قابل تجزیه و تحلیل یا پردازش باشد.
ذخیره سازی داده ها: تبدیل داده های رمزگذاری شده به فرمتی که به راحتی در پایگاه داده یا سیستم فایل ذخیره شود.
تجسم داده ها: تبدیل داده های رمزگذاری شده به قالبی که به راحتی قابل مشاهده یا نمایش باشد.
رمزگشایی اساساً فرآیند معکوس رمزگذاری است و یک مرحله ضروری در بسیاری از خطوط لوله پردازش داده است.
در Golang می توانیم از بسته encoding/json
برای رمزگشایی داده های JSON استفاده کنیم.
نحوه استفاده از تابع Unmarshal برای تجزیه درخواست های JSON
تابع Unmarshal
متداول ترین روش برای رمزگشایی داده های JSON در Golang است. یک رشته رمزگذاری شده با JSON را به عنوان ورودی می گیرد و یک ساختار داده Go برمی گرداند.
توضیح کد:
داخل هندلر:
تابع handler
یک کنترل کننده HTTP است که درخواست های HTTP ورودی را مدیریت می کند.
w http.ResponseWriter
: برای نوشتن پاسخ استفاده می شود.
r *http.Request
: نشان دهنده درخواست ورودی است.
یک person
متغیر از نوع Person
اعلام شد.
json.NewDecoder(r.Body).Decode(&person)
: این قسمت بدنه درخواست JSON را در ساختار person
رمزگشایی می کند.
اگر در حین رمزگشایی خطایی رخ دهد، یک پاسخ خطای HTTP 400 را با کد وضعیت 400 Bad Request
ارسال میکند.
اگر رمزگشایی موفقیت آمیز باشد، فیلدهای Name
و Age
توسط person
با استفاده از fmt.Println
چاپ می شود.
نحوه استفاده از تابع NewDecoder برای رمزگشایی JSON
تابع NewDecoder
همچنین برای رمزگشایی داده های JSON از یک خواننده، مانند یک فایل یا اتصال شبکه، استفاده می شود.
توضیح کد:
داخل تابع هندلر:
تابع handler
یک کنترل کننده HTTP است که درخواست های HTTP ورودی را مدیریت می کند.
w http.ResponseWriter
: برای نوشتن پاسخ استفاده می شود.
r *http.Request
: نشان دهنده درخواست ورودی است.
ایجاد رمزگشا:
decoder := json.NewDecoder(r.Body)
: رمزگشای جدید JSON ایجاد می کند که از بدنه درخواست می خواند.
اعلان یک متغیر شخص:
var person Person
: یک person
متغیر از نوع Person
را اعلام می کند.
رمزگشایی JSON به ساختار شخصی:
err := decoder.Decode(&person)
: JSON را از بدنه درخواست به ساختار person
رمزگشایی می کند.
اگر در حین رمزگشایی خطایی رخ دهد، یک پاسخ خطای HTTP 400 با کد وضعیت 400 Bad Request
ارسال می کند و از تابع برمی گردد.
چاپ مقادیر رمزگشایی شده:
fmt.Println(person.Name)
: فیلد Name
ساختار person
را چاپ می کند.
fmt.Println(person.Age)
: فیلد Age
ساختار person
را چاپ می کند.
سفارشی JSON Marshaling و Unmarshaling
در برخی موارد، رفتار رمزگشایی و رمزگشایی پیشفرض JSON ارائه شده توسط json.Marshal
و json.Unmarshal
ممکن است کافی نباشد. به عنوان مثال، ممکن است لازم باشد نحوه نمایش فیلدهای خاص در JSON را سفارشی کنید. اینجاست که رابط های json.Marshaler
و json.Unmarshaler
به کار می آیند.
نحوه استفاده از JSON Marshaler
رابط json.Marshaler
به شما این امکان را می دهد که رمزگذاری JSON یک نوع را با پیاده سازی متد MarshalJSON
سفارشی کنید. این روش یک تکه بایت کدگذاری شده با JSON و یک خطا را برمی گرداند.
func (p Person) MarshalJSON() ([]byte, error) { type Alias Person return json.Marshal(&struct { Alias Age string `json:"age"` }{ Alias: (Alias)(p), Age: strconv.Itoa(p.Age) + " years", }) }
در این مثال، فیلد Age
هنگام رمزگذاری به JSON به رشته ای با پسوند "year" تبدیل می شود.
نحوه استفاده از JSON Unmarshaler
رابط json.Unmarshaler
به شما امکان می دهد رمزگشایی JSON یک نوع را با پیاده سازی روش UnmarshalJSON
سفارشی کنید. این روش یک تکه بایت کدگذاری شده با JSON می گیرد و یک خطا برمی گرداند.
func (p *Person) UnmarshalJSON(data []byte) error { type Alias Person aux := &struct { Alias Age string `json:"age"` }{Alias: (Alias)(*p)} if err := json.Unmarshal(data, &aux); err != nil { return err } ageStr := strings.TrimSuffix(aux.Age, " years") age, err := strconv.Atoi(ageStr) if err != nil { return err } p.Age = age p.Name = aux.Name return nil }
در این مثال، هنگام رمزگشایی از JSON، فیلد Age
از رشته ای با پسوند "year" به یک عدد صحیح تبدیل می شود.
مبادلات
از روش های مختلفی که در بالا برای رمزگذاری و رمزگشایی JSON توضیح داده شد. در اینجا معاوضه هایی برای متداول ترین روش ها وجود دارد:
json.Marshal و json.Unmarshal:
طرفداران:
سهولت استفاده : ساده برای رمزگذاری (Marshal) و رمزگشایی (Unmarshal) JSON.
انعطاف پذیری : می تواند با انواع مختلف از جمله ساختارها، نقشه ها، برش ها و موارد دیگر استفاده شود.
سفارشی سازی : تگ های ساختاری ( json:"name"
) امکان سفارشی سازی کلیدهای JSON و سایر گزینه ها را فراهم می کند.
معایب:
عملکرد : ممکن است سریعترین روش برای ساختارهای JSON بسیار بزرگ یا پیچیده نباشد.
مدیریت خطا : گاهی اوقات پیام های خطا می توانند برای ساختارهای داده عمیق تودرتو یا پیچیده کمتر توصیف شوند.
json.NewEncoder و json.NewDecoder:
طرفداران:
مبتنی بر جریان : مناسب برای رمزگذاری/رمزگشایی JSON به شیوهای استریم، که میتواند مجموعههای داده بزرگ را بدون مصرف حافظه زیاد مدیریت کند.
انعطاف پذیری : می تواند به طور مستقیم با رابط های io.Reader
و io.Writer
کار کند و آنها را برای عملیات شبکه و فایل های بزرگ مفید می کند.
معایب:
پیچیدگی : استفاده از آن در مقایسه با json.Marshal
و json.Unmarshal
کمی پیچیده تر است.
مدیریت خطا : مشابه json.Marshal
و json.Unmarshal
، پیام های خطا برای ساختارهای پیچیده کمتر واضح است.
رابط های سفارشی Marshaler و Unmarshaler (json.Marshaler و json.Unmarshaler):
طرفداران:
سفارشی سازی : کنترل کامل بر نحوه کدگذاری/رمزگشایی انواع. برای مدیریت انواع پیچیده یا ساختارهای سفارشی JSON مفید است.
انعطافپذیری : امکان پیادهسازی منطق سفارشی را در حین مارشال کردن/"جداسازی" فراهم میکند.
معایب:
پیچیدگی : برای پیاده سازی و استفاده پیچیده تر است، زیرا به نوشتن روش های سفارشی نیاز دارد.
Maintenance : بار تعمیر و نگهداری را افزایش می دهد زیرا منطق سفارشی باید با هر تغییری در ساختار یا قالب داده هماهنگ باشد.
از موارد و توصیه ها استفاده کنید
ساختارهای داده ساده : از json.Marshal
و json.Unmarshal
برای رمزگذاری/رمزگشایی ساده ساختارهای داده ساده استفاده کنید.
جریانهای بزرگ داده : از json.NewEncoder
و json.NewDecoder
برای کار با جریانهای داده بزرگ یا هنگام تعامل با فایلها یا عملیات شبکه استفاده کنید.
الزامات سفارشی : هنگامی که به رفتار سفارشی برای انواع خاصی نیاز دارید، رابط های json.Marshaler
و json.Unmarshaler
را پیاده سازی کنید.
عملیات سریع : از ساختارهای ناشناس برای عملیات سریع و دور ریختنی استفاده کنید که در آن تعریف یک نوع ساختار کامل غیر ضروری است.
هر روشی نقاط قوت و معاوضه های خاص خود را دارد و بهترین انتخاب به نیازهای خاص برنامه شما بستگی دارد.
نتیجه
در نتیجه، تسلط بر رمزگذاری و رمزگشایی JSON برای توسعه برنامه های کاربردی وب در Golang بسیار مهم است.
با درک روش های مختلف موجود در بسته encoding/json
، می توانید مناسب ترین رویکرد را بر اساس نیازهای خاص خود انتخاب کنید.
توابع Marshal
و Unmarshal
سادگی و انعطافپذیری را برای استفاده عمومی ارائه میدهند، در حالی که NewEncoder
و NewDecoder
قابلیتهای جریان کارآمدی را برای مجموعه دادههای بزرگ ارائه میکنند.
برای سناریوهایی که نیاز به نمایش های سفارشی JSON دارند، پیاده سازی رابط های json.Marshaler
و json.Unmarshaler
به شما کنترل دقیقی بر فرآیندهای رمزگذاری و رمزگشایی می دهد.
هر روشی نقاط قوت و معاوضه های خاص خود را دارد و دانستن زمان و نحوه استفاده از آنها به شما امکان می دهد داده های JSON را به طور موثر در برنامه های خود مدیریت کنید.
ارسال نظر