php-Editor Xigua bietet hier eine optimierte Anleitung zur Normalisierung von JSON-Daten in API-Strukturen in Go. In modernen Webanwendungen ist die Arbeit mit JSON-Daten eine häufige Aufgabe. Als leistungsstarke Back-End-Sprache bietet die Go-Sprache eine präzise und flexible Möglichkeit, JSON-Daten zu verarbeiten. In diesem Artikel wird erläutert, wie Sie Strukturen in der Go-Sprache verwenden, um JSON-Daten zu normalisieren, damit sie besser verarbeitet und manipuliert werden können. Egal, ob Sie Anfänger oder erfahrener Entwickler sind, dieser Artikel liefert Ihnen nützliche Tipps und praktische Beispiele. Lasst uns beginnen!
Ich bin ziemlich neu und versuche herauszufinden, ob es einen saubereren Weg gibt, die Normalisierung von JSON-Daten vom Frontend (js) zu meiner API zu erreichen. Um sicherzustellen, dass beim Erstellen von Variablen aus der Struktur (model.expense) die richtigen Typen verwendet werden, speichere ich die Nutzlast in einer Karte, normalisiere sie dann und speichere sie wieder in der Struktur. Wenn mir jemand einen besseren Weg zeigen könnte, damit umzugehen, wäre ich sehr dankbar! Dank im Voraus!
Modell. Gebührenstruktur:
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"` }
Problematischer Controller:
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... }
Sie können die json.unmarshaljson
-Schnittstelle definieren und die Daten dann bei Bedarf manuell validieren. Versuchen Sie so etwas:
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) }
Ausgabe: {moneyowed:123.12}
Spielplatz-Link: https://www.php.cn/link/87ca4eb840b6f78e3b6d6b418c0fef40
Das obige ist der detaillierte Inhalt vonSo normalisieren Sie JSON-Daten am besten in API-Strukturen in Go. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!