خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

راهنمای استفاده از JSON در Go

JSON یکی از همه کاره ترین و قابل حمل ترین فرمت های داده است و Go از پشتیبانی عالی برای کار با آن برخوردار است.

JSON (JavaScript Object Notation) یک فرمت داده بسیار همه کاره و بسیار محبوب است. اغلب برای ارتباط بین برنامه های وب و همچنین به عنوان یک روش راحت برای ذخیره مقادیر زیادی از داده های برنامه های ساخت یافته استفاده می شود.

JSON آنقدر مفید است که تقریباً تمام زبان های برنامه نویسی مدرن از جمله Go پشتیبانی داخلی برای کار با آن ارائه می دهند.

کار با JSON در Go

می‌توانید بیشتر کارهایی را که با JSON انجام می‌دهید به دو دسته کلی تقسیم کنید: مارشال کردن و حذف کردن. ویکی‌پدیا مارشال را اینگونه تعریف می‌کند:

در علوم کامپیوتر، مارشال کردن فرآیند تبدیل نمایش حافظه یک شی به فرمت داده مناسب برای ذخیره یا انتقال است. معمولاً زمانی استفاده می شود که داده ها باید بین قسمت های مختلف یک برنامه کامپیوتری یا از یک برنامه به برنامه دیگر منتقل شوند.

به عبارت ساده تر، مارشال کردن فرآیند تبدیل داده های ذخیره شده در یک متغیر به فرمی است که انتقال آن به برنامه دیگری آسان تر است. Unmarshaling فرآیند معکوس است: شامل گرفتن داده های قالب بندی شده برای حمل و نقل و تبدیل آن به فرمی است که استفاده از آن برای برنامه شما آسان تر است.

با استفاده از Go، می توانید ساختارهای داده بومی را در JSON قرار دهید. و می توانید عمل معکوس را انجام دهید و داده های JSON را در متغیرهای Go جدا کنید.

مارشال کردن به JSON در Go

Go بسته encoding/json را فراهم می کند تا کار با JSON را برای شما آسان کند. این بسته شامل چندین توابع است، اما تابعی که برای مارشال کردن استفاده خواهید کرد، تابع Marshal است. مارشال دارای امضای تابع زیر است:

func Marshal(v interface{}) ([]byte, error)

این بدان معنی است که مارشال یک پارامتر از هر نوع داده را می پذیرد و دو مقدار را برمی گرداند: یک تکه بایت و یک خطا. به عبارت دیگر، شما مارشال را با مقدار Go فرا می‌خوانید و آن را به JSON تبدیل می‌کند و معادل JSON را برمی‌گرداند. اگر در طول فرآیند تبدیل با خطا مواجه شد، خطا و یک برش خالی را برمی‌گرداند.

مطلب مرتبط:   10 شغل و شغل برنامه نویسی کامپیوتر که تقاضای بالایی دارند

در اینجا یک نمونه کد است که از Marshal برای تبدیل نقشه به JSON استفاده می کند. برای اجرای این مثال، تنها چیزی که نیاز دارید این است که یک فایل Go در ویرایشگر کد مورد علاقه خود ایجاد کنید یا از زمین بازی Go استفاده کنید:

package main
 
import (
    "encoding/json"
    "fmt"
)
 
func main() {
    val := map[string]int{
        "john": 25,
        "mary": 19,
        "adam": 5,
    }
 
    res, _ := json.Marshal(val)
    fmt.Println(string(res))
}

اگر آن کد را اجرا کنید، خروجی زیر را خواهد داشت:

خروجی خط فرمان

همانطور که قبلاً ذکر شد، می‌توانید هر نوع داده Go را به JSON هدایت کنید، اگرچه در زندگی واقعی معمولاً ساختارها را مارشال می‌کنید. به همین دلیل، Go یک ویژگی به نام تگ های ساختاری را ارائه می دهد تا به شما اجازه دهد دستورالعمل های اضافی برای تبدیل ساختارهای خود به مارشال بدهید.

تگ struct رشته ای است که شما در اعلان ساختار خود در کنار نوع داده یک فیلد قرار می دهید. تگ‌های ساختاری به شما امکان می‌دهند نحوه برخورد مارشال با فیلدی که تگ به آن تعلق دارد را تنظیم کنید. می‌توانید از تگ‌های ساختاری برای تغییر نام یک فیلد در خروجی JSON یا حتی حذف کامل آن استفاده کنید. تگ های Struct (که مارشال تشخیص می دهد) با زیر رشته “json:” شروع می شود.

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

package main
 
import (
    "encoding/json"
    "fmt"
)
 
func main() {
    type Car struct {
        Brand string
        Model string
        Price int
    }
 
    val := Car{Brand: "Mercedes", Model: "Benz", Price: 50000}
    res, _ := json.Marshal(val)
    fmt.Println(string(res))
}

این کد خروجی را تولید می کند:

مطلب مرتبط:   نحوه مدیریت نسخه های مختلف یونیتی با استفاده از یونیتی هاب

خروجی خط فرمان

فیلدهای برند، مدل و قیمت خودرو باید با حروف بزرگ شروع شوند، در غیر این صورت مارشال قادر به تبدیل آنها نخواهد بود. این باعث می شود که فیلدهای خروجی JSON نیز با حروف بزرگ شروع شوند. اما اگر بخواهید نام‌ها با حروف کوچک در JSON شروع شوند، یا اگر بخواهید نام یک فیلد را به طور کامل تغییر دهید، چه؟ اینجاست که تگ های struct وارد می شوند. در اینجا یک مثال آورده شده است:

package main
 
import (
    "encoding/json"
    "fmt"
)
 
func main() {
    type Car struct {
        ID int `json:"-"`
        Brand string `json:"type"`
        Model string `json:"model"`
        Price int `json:"price"`
    }
 
    val := Car{ID: 0, Brand: "Mercedes", Model: "Benz", Price: 50000}
    res, _ := json.Marshal(val)
    fmt.Println(string(res))
}

این کد فیلد ID جدیدی را معرفی می کند که مارشال از طریق یک تگ struct از خروجی JSON حذف می کند. کد همچنین از تگ های ساختار برای تغییر نام سایر فیلدهای ساختار استفاده می کند. این هم خروجی برنامه:

خروجی خط فرمان

همانطور که می بینید، بخشی از تگ struct که به دنبال “json:” است، به نام فیلد در خروجی مارشال تبدیل می شود. یک استثنا وجود دارد: اگر رشته “-” باشد، مارشال آن فیلد را از خروجی حذف می کند. می‌توانید اطلاعات بیشتری درباره برچسب‌های Marshal و struct در مستندات Go بخوانید.

حذف از JSON در Go

بسته encoding/json یک تابع unmarshaling نیز ارائه می دهد که Unmarshal نامیده می شود. دارای امضای تابع زیر است:

func Unmarshal(data []byte, v interface{}) error

برخلاف مارشال، Unmarshal مقداری را بر نمی گرداند. در عوض، JSON را به‌عنوان تکه‌ای از بایت‌ها در آرگومان اول می‌پذیرد و سپس داده‌های تبدیل‌شده را در شیئی که آرگومان دومش به آن اشاره می‌کند، ذخیره می‌کند. Unmarshal با تگ های struct نیز کار می کند، اما در اینجا، تگ ها به Unmarshal می گویند که کدام فیلدهای JSON با کدام فیلدهای ساختار مطابقت دارند.

مطلب مرتبط:   3 روش برای پایان دادن به برنامه در پایتون

هنگام جداسازی در یک برنامه، ممکن است داده‌ها را از یک API واکشی کنید، اما در اینجا از داده‌های ساختگی استفاده می‌کنید. در اینجا نحوه استفاده از Unmarshal آمده است:

package main
 
import (
    "encoding/json"
    "fmt"
)
 
func main() {
    type Car struct {
        ID int `json:"-"`
        Brand string `json:"type"`
        Model string `json:"model"`
        Price int `json:"price"`
    }
 
    jsonInput := `{
        "type": "Toyota",
        "model": "Camry",
        "price": 2000
    }`
 
    var jsonOutput Car
    err := json.Unmarshal([]byte(jsonInput), &jsonOutput)
 
    if err != nil {
        fmt.Println("JSON decode error!")
        return
    }
 
    fmt.Println(jsonOutput)
}

این کد از همان نوع Car مانند مثال قبلی استفاده می کند و یک شی JSON را به ساختاری از نوع Car تبدیل می کند و سپس داده ها را در ساختار چاپ می کند. هنگام اجرا، برنامه این خروجی را تولید می کند:

خروجی خط فرمان

این نشان می‌دهد که داده‌های جعلی JSON با موفقیت در ساختار jsonOutput حذف شده است.

Go کار با JSON را آسان می کند

با بسته encoding/json، کار با JSON in Go به سادگی دو فراخوانی تابع است: Marshal و Unmarshal. Go همچنین به شما امکان می‌دهد فرآیند marshaling/unmarshaling JSON را با تگ‌های struct سفارشی کنید.

تبدیل داده ها به JSON یک راه عالی برای اشتراک گذاری آن با برنامه یا فرآیند دیگری است. فرمت آنقدر جهانی است که JSON تا آنجا که می تواند قابل حمل است.