1. package main
    2. import (
    3. "encoding/json"
    4. "fmt"
    5. )
    6. type Bird struct {
    7. A map[string]string `json:"a"`
    8. }
    9. func (bd *Bird) MarshalJSON() ([]byte, error) {
    10. // 注意:此处不能使用Bird类型的变量,否则会陷入死循环
    11. l := []string{}
    12. for _,v := range bd.A {
    13. l = append(l,v)
    14. }
    15. return json.Marshal(l)
    16. }
    17. func (bd *Bird) UnmarshalJSON(b []byte) error {
    18. // 注意:此处不能使用Bird类型的变量,否则会陷入死循环
    19. l := []string{}
    20. err := json.Unmarshal(b, &l)
    21. if err != nil {
    22. return err
    23. }
    24. for i,v := range l {
    25. k := fmt.Sprintf("%d", i)
    26. bd.A[k] = v
    27. }
    28. return nil
    29. }
    30. func main() {
    31. m := map[string]string{"1": "110", "2":"120", "3":"119"}
    32. xiQue := &Bird{A:m}
    33. xJson, err := json.Marshal(xiQue)
    34. if err != nil {
    35. fmt.Println("json.Marshal failed:", err)
    36. }
    37. fmt.Println("xJson:", string(xJson))
    38. b := `["apple", "orange", "banana"]`
    39. baoXiNiao := &Bird{A:map[string]string{}}
    40. //json.Unmarshal的第二个参数只有为Bird类型时才会调用自己实现的接口
    41. err = json.Unmarshal([]byte(b), baoXiNiao)
    42. if err != nil {
    43. fmt.Println("json.Unmarshal failed:", err)
    44. }
    45. fmt.Println("baoXiNiao:", baoXiNiao)
    46. }

    xJson: [“110”,“120”,“119”]
    baoXiNiao: &{map[0:apple 1:orange 2:banana]}