متن خبر

نحوه ارسال و تجزیه داده های JSON در Golang – رمزگذاری و رمزگشایی داده ها با مثال توضیح داده شده است

نحوه ارسال و تجزیه داده های JSON در Golang – رمزگذاری و رمزگشایی داده ها با مثال توضیح داده شده است

شناسهٔ خبر: 679474 -




هنگام ساخت برنامه های وب در 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 را برمی گرداند.

 package main import ( "encoding/json" "fmt" "net/http" ) type Person struct { Name string `json:"name"` Age int `json:"age"` } func handler(w http.ResponseWriter, r *http.Request) { person := Person{ Name: "John", Age: 30, } // Encoding - One step jsonStr, err := json.Marshal(person) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Write(jsonStr) } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) }
استفاده از Marshal()

توضیح کد:

واردات:

encoding/json : توابعی را برای رمزگذاری و رمزگشایی JSON ارائه می دهد.

fmt : برای خروجی چاپ.

ساختار کاربر:

یک ساختار User را با فیلدهای Name و Age تعریف می کند.

تگ های Struct (به عنوان مثال: json:"name" ) نام کلیدهای JSON را مشخص می کنند.

عملکرد اصلی:

یک نمونه User ایجاد می کند.

json.Marshal را فراخوانی می کند تا ساختار user را در JSON کدگذاری کند. این یک تکه بایت و یک خطا را برمی گرداند.

اگر خطایی وجود نداشته باشد، برش بایت را به یک رشته تبدیل می کند و آن را چاپ می کند.

نحوه استفاده از تابع NewEncoder

تابع NewEncoder برای رمزگذاری داده های JSON به یک نویسنده، مانند یک فایل یا اتصال شبکه، استفاده می شود.

 package main import ( "encoding/json" "fmt" "net/http" ) type Person struct { Name string `json:"name"` Age int `json:"age"` } func handler(w http.ResponseWriter, r *http.Request) { person := Person{ Name: "John", Age: 30 } // Encoding - 2 step . NewEncoder and Encode encoder := json.NewEncoder(w) err := encoder.Encode(person) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return }} func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) }
استفاده از NewEncoder()

توضیح کد:

داخل هندلر:

تابع 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 برمی گرداند.

 package main import ( "encoding/json" "fmt" "net/http" ) type Person struct { Name string `json:"name"` Age int `json:"age"` } func handler(w http.ResponseWriter, r *http.Request) { var person Person err := json.NewDecoder(r.Body).Decode(&person) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } fmt.Println(person.Name) // Output: John fmt.Println(person.Age) // Output: 30 } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) }
استفاده از تابع UnMarshal()

توضیح کد:

داخل هندلر:

تابع 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 از یک خواننده، مانند یک فایل یا اتصال شبکه، استفاده می شود.

 package main import ( "encoding/json" "fmt" "net/http" ) type Person struct { Name string `json:"name"` Age int `json:"age"` } func handler(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) var person Person err := decoder.Decode(&person) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } fmt.Println(person.Name) // Output: John fmt.Println(person.Age) // Output: 30 } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) }
استفاده از NewDecoder()

توضیح کد:

داخل تابع هندلر:

تابع 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 را به طور موثر در برنامه های خود مدیریت کنید.

خبرکاو

ارسال نظر




تبليغات ايهنا تبليغات ايهنا

تمامی حقوق مادی و معنوی این سایت متعلق به خبرکاو است و استفاده از مطالب با ذکر منبع بلامانع است