


Cara terbaik untuk menormalkan data JSON ke dalam struct API dalam Go
editor php Xigua di sini membawa panduan diperkemas tentang cara menormalkan data JSON ke dalam struktur API dalam Go. Dalam aplikasi web moden, bekerja dengan data JSON adalah tugas biasa. Sebagai bahasa back-end yang berkuasa, bahasa Go menyediakan cara yang ringkas dan fleksibel untuk memproses data JSON. Artikel ini akan memperkenalkan cara menggunakan struktur dalam bahasa Go untuk menormalkan data JSON supaya ia boleh diproses dan dimanipulasi dengan lebih baik. Sama ada anda seorang pemula atau pembangun berpengalaman, artikel ini akan memberikan anda petua berguna dan contoh praktikal. Mari mulakan!
Kandungan soalan
Saya agak baru untuk pergi dan cuba menentukan sama ada terdapat cara yang lebih bersih untuk mencapai normalisasi data json dari hujung hadapan (js) ke api saya. Untuk memastikan bahawa jenis yang betul digunakan semasa mencipta pembolehubah daripada struct (model.expense), saya membuang muatan ke dalam peta, kemudian menormalkan dan menyimpan semula ke struct. Jika sesiapa boleh mengajar saya cara yang lebih baik untuk mengendalikan ini, saya akan sangat berterima kasih! Terima kasih terlebih dahulu!
Struktur Yuran Model:
type expense struct { id primitive.objectid `json:"_id,omitempty" bson:"_id,omitempty"` name string `json:"name"` frequency int `json:"frequency"` startdate *time.time `json:"startdate"` enddate *time.time `json:"enddate,omitempty"` cost primitive.decimal128 `json:"cost"` paid []string `json:"paid,omitempty"` }
Pengawal bermasalah:
func InsertOneExpense(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.Header().Set("Allow-Control-Allow-Methods", "POST") var expense map[string]interface{} json.NewDecoder(r.Body).Decode(&expense) var expenseName string if name, ok := expense["name"]; ok { expenseName = fmt.Sprintf("%v", name) } else { json.NewEncoder(w).Encode("missing required name") } var expenseFrequency int if frequency, ok := expense["frequency"]; ok { expenseFrequency = int(frequency.(float64)) } else { expenseFrequency = 1 } // Handle startDate normalization var expenseStartDate *time.Time if startDate, ok := expense["startDate"]; ok { startDateString := fmt.Sprintf("%v", startDate) startDateParsed, err := time.Parse("2006-01-02 15:04:05", startDateString) if err != nil { log.Fatal(err) } expenseStartDate = &startDateParsed } else { json.NewEncoder(w).Encode("missing required startDate") } // Handle endDate normalization var expenseEndDate *time.Time if endDate, ok := expense["endDate"]; ok { endDateString := fmt.Sprintf("%v", endDate) endDateParsed, err := time.Parse("2006-01-02 15:04:05", endDateString) if err != nil { log.Fatal(err) } expenseEndDate = &endDateParsed } else { expenseEndDate = nil } // Handle cost normaliztion var expenseCost primitive.Decimal128 if cost, ok := expense["cost"]; ok { costString := fmt.Sprintf("%v", cost) costPrimitive, err := primitive.ParseDecimal128(costString) if err != nil { log.Fatal(err) } expenseCost = costPrimitive } else { json.NewEncoder(w).Encode("missing required cost") return } normalizedExpense := model.Expense{ Name: expenseName, Frequency: expenseFrequency, StartDate: expenseStartDate, EndDate: expenseEndDate, Cost: expenseCost, } // Do more things with the struct var... }
Penyelesaian
Anda boleh menentukan antara muka json.unmarshaljson
dan kemudian mengesahkan data secara manual jika perlu. Cuba sesuatu seperti ini:
package main import ( "encoding/json" "fmt" "strconv" ) type CoolStruct struct { MoneyOwed string `json:"money_owed"` } // UnmarshalJSON the json package will delegate deserialization to our code if we implement the json.UnmarshalJSON interface func (c *CoolStruct) UnmarshalJSON(data []byte) error { // get the body as a map[string]*[]byte raw := map[string]*json.RawMessage{} if err := json.Unmarshal(data, &raw); err != nil { return fmt.Errorf("unable to unmarshal raw meessage map: %w", err) } // if we don't know the variable type sent we can unmarshal to an interface var tempHolder interface{} err := json.Unmarshal(*raw["money_owed"], &tempHolder) if err != nil { return fmt.Errorf("unable to unmarshal custom value from raw message map: %w", err) } // the unmarshalled interface has an underlying type use go's typing // system to determine type conversions / normalizations required switch tempHolder.(type) { case int64: // once we determine the type of the we just assign the value // to the receiver's field c.MoneyOwed = strconv.FormatInt(tempHolder.(int64), 10) // we could list all individually or as a group; driven by requirements case int, int32, float32, float64: c.MoneyOwed = fmt.Sprint(tempHolder) case string: c.MoneyOwed = tempHolder.(string) default: fmt.Printf("missing type case: %T\n", tempHolder) } // success; struct is now populated return nil } func main() { myJson := []byte(`{"money_owed": 123.12}`) cool := CoolStruct{} // outside of your struct you marshal/unmarshal as normal if err := json.Unmarshal(myJson, &cool); err != nil { panic(err) } fmt.Printf("%+v\n", cool) }
Output: {moneyowed:123.12}
Pautan taman permainan: https://www.php.cn/link/87ca4eb840b6f78e3b6d6b418c0fef40
Atas ialah kandungan terperinci Cara terbaik untuk menormalkan data JSON ke dalam struct API dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Perpustakaan yang digunakan untuk operasi nombor terapung dalam bahasa Go memperkenalkan cara memastikan ketepatannya ...

Masalah Threading Giliran di GO Crawler Colly meneroka masalah menggunakan Perpustakaan Colly Crawler dalam bahasa Go, pemaju sering menghadapi masalah dengan benang dan permintaan beratur. � ...

Perpustakaan mana yang dibangunkan oleh syarikat besar atau projek sumber terbuka yang terkenal? Semasa pengaturcaraan di GO, pemaju sering menghadapi beberapa keperluan biasa, ...

Dua cara untuk menentukan struktur dalam bahasa Go: perbezaan antara VAR dan jenis kata kunci. Apabila menentukan struktur, pergi bahasa sering melihat dua cara menulis yang berbeza: pertama ...

Masalah menggunakan redisstream untuk melaksanakan beratur mesej dalam bahasa Go menggunakan bahasa Go dan redis ...

Perbezaan antara percetakan rentetan dalam bahasa Go: perbezaan kesan menggunakan fungsi println dan rentetan () sedang ...

Apa yang perlu saya lakukan jika label struktur tersuai di Goland tidak dipaparkan? Apabila menggunakan Goland untuk Pembangunan Bahasa GO, banyak pemaju akan menghadapi tag struktur tersuai ...

GO Pointer Syntax dan menangani masalah dalam penggunaan perpustakaan Viper semasa pengaturcaraan dalam bahasa Go, adalah penting untuk memahami sintaks dan penggunaan petunjuk, terutama dalam ...
