Go 語言中的 json 包默認情況下會隨機生成 json 字符串中的 key 順序。這是因為 Go 語言中的 map 是無序的,所以 json 包為了反映出這個特性,每次生成 json 字符串時都會隨機生成 key 順序。
這對于 json 字符串的解析并沒有任何影響,因為 json 解析器應該可以處理無序元素。但是,這可能導致一些問題。例如,當需要在兩次生成 json 字符串時進行比較時,其順序不同的 json 字符串會被認為不同,即使它們在邏輯上是相同的。
如果需要在生成 json 字符串時使用有序的 key 順序,請使用結構體并在字段上使用 tag,以指定 json key 的名稱和順序。例如:
type Person struct { Name string `json:"name"` Age int `json:"age"` Height int `json:"height"` }
在使用上述結構體將數據轉換為 json 字符串時,key 的順序將按照 tag 中指定的順序生成。例如:
person := Person{"Alice", 25, 170} bytes, _ := json.Marshal(person) fmt.Println(string(bytes)) // {"name":"Alice","age":25,"height":170}
你也可以使用 map[string]interface{} 類型來指定 key 的順序。在定義一個 map 時,你可以使用一個字符串切片作為鍵名,并在指定每個鍵名時指定其順序。例如:
person := map[string]interface{}{ "name": "Alice", "age": 25, "height": 170, } keys := []string{"name", "age", "height"} bytes, _ := gojson.MarshalOrder(keys, person) fmt.Println(string(bytes)) // {"name":"Alice","age":25,"height":170}
在上面的代碼中,我們使用了 gojson 包的 MarshalOrder 方法以按照指定的 key 順序生成 json 字符串。