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!
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... }
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!