動態刪除或隱藏 JSON 回應中的欄位
使用 API 回應時,控制傳回的特定欄位通常很有用來電者。在 Go 中,結構體通常用於表示編碼為 JSON 的資料。但是,靜態定義的結構體標籤可能無法提供足夠的彈性來動態刪除或隱藏特定欄位。
從結構體中刪除欄位
動態刪除欄位是不可能的來自 Go 中的結構。在結構體中聲明的欄位永久是類型定義的一部分。
在 JSON 回應中隱藏欄位
JSON omitempty 標籤可用於隱藏 JSON 回應中的空白欄位JSON 回應。但是,這種方法不適合需要隱藏非空白欄位的情況。
使用映射而不是結構
動態控制包含的字段的一種方法響應中是使用map[string]interface{}。映射是鍵值對的無序集合。您可以使用刪除內建函數從地圖中刪除欄位。
package main import ( "encoding/json" "fmt" ) type SearchResults struct { NumberResults int `json:"numberResults"` Results []map[string]interface{} `json:"results"` } func main() { // Assume we obtained the following map from a query result := map[string]interface{}{ "idCompany": 1, "company": "Acme Inc.", "industry": "Manufacturing", "idState": 5, "state": "New York", "country": "US", "otherField1": "Some Value 1", "otherField2": 2.3, } // Create a SearchResults struct searchResults := SearchResults{ NumberResults: 1, Results: []map[string]interface{}{result}, } // Remove any fields not specified in the `fields` GET parameter fields := []string{"idCompany", "company", "state"} for k, v := range searchResults.Results { for f := range v { if !contains(fields, f) { delete(v, f) } } } // Encode the modified SearchResults as JSON jsonBytes, _ := json.Marshal(searchResults) // Print the JSON fmt.Println(string(jsonBytes)) } func contains(s []string, e string) bool { for _, a := range s { if a == e { return true } } return false }
在此範例中,要傳回的欄位在 fields GET 參數中指定。程式碼會迭代地圖,刪除未包含在指定清單中的所有欄位。最後,修改後的地圖被編碼為 JSON 並傳回給呼叫者。
替代方法
另一種替代方法是僅在資料庫中查詢請求的欄位。此方法需要修改 SQL 查詢以僅包含所需的欄位。雖然這種方法更有效,但並非在所有情況下都可行。
以上是如何在 Go 中動態控制 JSON 回應欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!