我们都知道map是无序的,每次取出key/value的顺序都可能不一致,但map转json的顺序是不是也是无序的吗?尽管json中的参数顺序大部分情况下对使用没有影响,我们不妨看看源码中怎么处理的。

先说结论:

map转json是有序的,按照ASCII码升序排列key。

溯源

源码位于encoding/json/encode.go中

type mapEncoder struct {elemEnc encoderFunc
}func (me mapEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) {if v.IsNil() {//为nil时,返回nulle.WriteString("null")return}e.WriteByte('{')// Extract and sort the keys.keys := v.MapKeys()//获取map中的所有keyssv := make([]reflectWithString, len(keys))for i, v := range keys {sv[i].v = vif err := sv[i].resolve(); err != nil {//处理key,尤其是非string(int/uint)类型的key转stringe.error(&MarshalerError{v.Type(), err})}}//排序,升序,直接比较字符串sort.Slice(sv, func(i, j int) bool { return sv[i].s < sv[j].s })for i, kv := range sv {if i > 0 {e.WriteByte(',')}e.string(kv.s, opts.escapeHTML)e.WriteByte(':')me.elemEnc(e, v.MapIndex(kv.v), opts)}e.WriteByte('}')
}func newMapEncoder(t reflect.Type) encoderFunc {switch t.Key().Kind() {case reflect.String,reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:default:if !t.Key().Implements(textMarshalerType) {return unsupportedTypeEncoder}}me := mapEncoder{typeEncoder(t.Elem())}return me.encode
}

golang map转json的顺序问题相关推荐

  1. Golang map转换为json

    m :=map[string]string{"type":"10","msg":"hello."} mjson,_ := ...

  2. Golang map 三板斧第二式:注意事项

    文章目录 1.默认初始值为 nil 2.range 顺序的随机性 3.引用传递 4.元素不可取址 5.并发读写问题 参考文献 map 使用起来非常方便,但也有些必须要注意的地方,否则可能会导致程序异常 ...

  3. Golang map 三板斧第三式:实现原理

    文章目录 1.数据结构 1.1 简介 1.2 核心结构 1.3 数据结构图 2.实现机制 2.1 创建 2.2 增加或修改 2.3 删除 2.4 查找 2.5 迭代 2.5.1 hiter 2.5.2 ...

  4. Golang 中使用 JSON 的一些小技巧 陶文 陶文 3 个月前 有的时候上游传过来的字段是string类型的,但是我们却想用变成数字来使用。 本来用一个json:,string 就可以支持了

    Golang 中使用 JSON 的一些小技巧 陶文 3 个月前 有的时候上游传过来的字段是string类型的,但是我们却想用变成数字来使用. 本来用一个json:",string" ...

  5. golang中的json

    编码 结构体生成json 使用json.Marshal()函数可以对一组数据进行json格式的编码. json.Marshal()函数的声明 func Marshal(v interface{}) ( ...

  6. Jackson 注解 -- 使用 Map存储JSON

    我们也可以使用 Map 存储 JSON, 而不用创建对应的对象. package shangbo.jackson.demo16;import java.util.HashMap; import jav ...

  7. json map java_Java:JSON和Map相互转换

    Java:JSON与Map相互转换 需要jar包:jackson-core-2.6.0.jar,jackson-databind-2.6.0.jar,jackson-annotations-2.6.0 ...

  8. java中map转为json数据_Java技术-将java中Map类型数据转化为json数据并以Ajax形式返回...

    Java技术-将java中Map类型数据转化为json数据并以Ajax形式返回html 1.自定义工具类(简单易用)-下面是我写的一个简单的工具类前端 package com.test.util; i ...

  9. httpf发送 json_Java用HttpClient3发送http/https协议get/post请求,发送map,json,xml,txt数据...

    使用的是httpclient 3.1, 使用"httpclient"4的写法相对简单点,百度:httpclient https post 当不需要使用任何证书访问https网页时, ...

  10. JS 中 Map 与 JSON 转换

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. JSON数据 转 字符串 JSON.stringify(jsondata) 2. 字符串 转 ...

最新文章

  1. Matlab与线性代数 -- 魔方矩阵
  2. 输入字符串中含有该字符的个数
  3. 积累有价值的seo资源提高网站优化效果
  4. 【javascript】数据结构-链表
  5. Property 'submit' of object #HTMLFormElement is not a function
  6. 消息人士:苹果要求代工商今年生产9000万部iPhone 13
  7. 从设计门禁系统到为何需要弱电与强电分开呢?
  8. 空间说说html,适合发空间说说的经典心情短语
  9. 高德行政区划地图,区域划线,行政区划浏览
  10. 读取.xls文件报错:XLRDError: Unsupported format, or corrupt file: Expected BOF record; found b‘MIME-Ver
  11. java订单超时取消设计_订单超时30分钟自动取消
  12. 解决CSS IOS字体自动调整放大了
  13. 2022年汽车驾驶员(技师)试题及在线模拟考试
  14. 百度推广系列之广告词编写必杀技
  15. 《白夜行》:请让孩子健康成长
  16. 打造更完美的小程序商城
  17. 今日头条有意向收购锤子科技;原金立总裁加入小米;苹果应用商店出现查开房记录app|雷锋早报...
  18. 中图法分类号(计算机专业)和文献标识码
  19. G2553与F5529串口
  20. 什么是搬砖套利赚钱模式?

热门文章

  1. POJ 1949 [最小优先队列]
  2. 最简单的Windows CE应用程序
  3. python实现移除某文件夹下所有文件
  4. 微型计算机机房湿度不宜过大,全国计算机一级考试选择题试题与详细答案(免费)...
  5. 用windbg调试程序与windbg命令的使用
  6. [看过不再忘]详细解析chmod修改文件权限
  7. OSError: [WinError 126] module could not be found(OSError: [WinError 126] 找不到指定的模块)
  8. css布局Absolute的垂直水平居中
  9. React.memo 是个啥么鬼?有什么用???
  10. 编码转换的php小脚本,php编码转换小例子