类似java中的LinkedHashMap,输出的json串是按key的插入顺序排序的
<br><br>
#### 场景
一个java项目,重构为go
某一个接口返回的数据结构是和客户端约定好的,有排序规则;返回结果是按key插入顺序进行排序的一个map转成的字符串(java中可以直接用LinkedHashMap<String, Object>,然后转json)
<br>
<br>
#### 源码
```go
package main
import (
"fmt"
"strings"
"encoding/json"
)
type Smap []*SortMapNode
type SortMapNode struct {
Key string
Val 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.Val
isSamp := false
str := ""
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 string
value 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 testStruct
t2.name = "testname"
t2.value = s2
s2.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"]
}
}
```
有疑问加站长微信联系(非本文作者))