REST api返回的json会自动按递增顺序排序

By simon at 2018-02-28 • 0人收藏 • 145人看过

我正在使用golang编译REST api,当我返回一个json时 员工喜欢

{
   "data":{
      "10":{
         "1517616000":[1000]
      },
      "15":{
         "1517616000":[1200]
      },
      "29":{
         "1517616000":[1200]
      },
      "42":{
         "1517616000":[1200]
      }
   }
}
它应该显示在42,15,29,10顺序,因为我正在用数据排序 优先级参数。当我检查控制台它显示我正确的输出,但 不开邮递员和浏览器 用下面的函数返回json
c.JSON(200, gin.H{
  "status": response,
 })

1 个回复 | 最后更新于 2018-02-28
2018-02-28   #1

如果您将42,15,29,10作为键存储在Go map,即JSON中 [mapEncoder](https://github.com/golang/go/blob/ed6c6c9c11496ed8e458f6e0731103126ce60223 / SRC /编码/ JSON / encode.go#L658-L685) 打印到JSON时将按键排序。 代替我们可以将数据作为元素存储在切片中,从而保留切片 我们指定的顺序。为了将切片打印为JSON地图而不是a JSON数组我们需要插入一些我们自己的JSON封送逻辑。

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
)

type Response struct {
    Data OrderedMap `json:"data"`
}

type OrderedMap []Entry

type Entry struct {
    Key   string
    Value interface{}
}

func (m OrderedMap) MarshalJSON() ([]byte, error) {
    var buf bytes.Buffer
    buf.WriteByte('{')
    for i, entry := range m {
        if i != 0 {
            buf.WriteByte(',')
        }
        key, err := json.Marshal(entry.Key)
        if err != nil {
            return nil, err
        }
        buf.Write(key)
        buf.WriteByte(':')
        value, err := json.Marshal(entry.Value)
        if err != nil {
            return nil, err
        }
        buf.Write(value)
    }
    buf.WriteByte('}')
    return buf.Bytes(), nil
}

func main() {
    response := Response{
        Data: OrderedMap{
            {"42", map[string][]int{"1517616000": []int{1200}}},
            {"15", map[string][]int{"1517616000": []int{1200}}},
            {"29", map[string][]int{"1517616000": []int{1200}}},
            {"10", map[string][]int{"1517616000": []int{1000}}},
        },
    }

    j, err := json.MarshalIndent(response, "", "  ")
    if err != nil {
        panic(err)
    }

    fmt.Println(string(j))
}
结果是相同的JSON你之前看到的代表性,但与 按照我们的OrderedMap指定的顺序输入密钥。
{
  "data": {
    "42": {
      "1517616000": [1200]
    },
    "15": {
      "1517616000": [1200]
    },
    "29": {
      "1517616000": [1200]
    },
    "10": {
      "1517616000": [1000]
    }
  }
}

登录后方可回帖

Loading...