map按插入順序排序後產生json
來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。類似java中的LinkedHashMap,輸出的json串是按key的插入順序排序的<br><br>#### 情境一個java項目,重構為go某一個介面返回的資料結構是和用戶端約定好的,有定序;返回結果是按key插入順序進行排序的一個map轉成的字串(java中可以直接用LinkedHashMap<String, Object>,然後轉json)<br><br>#### 源碼```gopackage mainimport ("fmt""strings""encoding/json")type Smap []*SortMapNodetype SortMapNode struct {Key stringVal interface{}}func (c *Smap) Put(key string, val interface{}) {index, _, ok := c.get(key)if ok {(*c)[index].Val = val} else {node := &SortMapNode{Key: key, Val: val}*c = append(*c, node)}}func (c *Smap) Get(key string) (interface{}, bool) {_, val, ok := c.get(key)return val, ok}func (c *Smap) get(key string) (int, interface{}, bool) {for index, node := range *c {if node.Key == key {return index, node.Val, true}}return -1, nil, false}func ToSortedMapJson(smap *Smap) string {s := "{"for _, node := range *smap {v := node.ValisSamp := falsestr := ""switch v.(type){case *Smap: isSamp = true str = ToSortedMapJson(v.(*Smap))}if(!isSamp){b, _ := json.Marshal(node.Val)str = string(b)}s = fmt.Sprintf("%s\"%s\":%s,", s, node.Key, str)}s = strings.TrimRight(s, ",")s = fmt.Sprintf("%s}", s)return s}type testStruct struct{name stringvalue interface{} }func main(){smap := &Smap{}n1 := []int{5, 6}n2 := []string{"s3", "s4"}n3 := []string{"s1", "s2"}n4 := []interface{}{"a",5,6.7}n4 = append(n4, "t")n4 = append(n4, 1)n4 = append(n4, 3.2)s1 := &Smap{}s1.Put("first", "1str")s1.Put("second", "2str")s1.Put("third", "3str")s2 := &Smap{}var t2 testStructt2.name = "testname"t2.value = s2s2.Put("s1", s1)arr2 := []string{"str1", "str2"}s2.Put("arr2", arr2)smap.Put("1int", n1)smap.Put("2string", n2)smap.Put("3string", n3)smap.Put("4interface", n4)smap.Put("5smap", s1)smap.Put("6interfaceSmap", s2)s := ToSortedMapJson(smap)fmt.Println(s)}```#### 運行結果(格式化後的json)```json{"1int": [5, 6],"2string": ["s3", "s4"],"3string": ["s1", "s2"],"4interface": ["a", 5, 6.7, "t", 1, 3.2],"5smap": {"first": "1str","second": "2str","third": "3str"},"6interfaceSmap": {"s1": {"first": "1str","second": "2str","third": "3str"},"arr2": ["str1", "str2"]}}```271 次點擊