golang map转json的顺序问题
我们都知道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的顺序问题相关推荐
- Golang map转换为json
m :=map[string]string{"type":"10","msg":"hello."} mjson,_ := ...
- Golang map 三板斧第二式:注意事项
文章目录 1.默认初始值为 nil 2.range 顺序的随机性 3.引用传递 4.元素不可取址 5.并发读写问题 参考文献 map 使用起来非常方便,但也有些必须要注意的地方,否则可能会导致程序异常 ...
- 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 ...
- Golang 中使用 JSON 的一些小技巧 陶文 陶文 3 个月前 有的时候上游传过来的字段是string类型的,但是我们却想用变成数字来使用。 本来用一个json:,string 就可以支持了
Golang 中使用 JSON 的一些小技巧 陶文 3 个月前 有的时候上游传过来的字段是string类型的,但是我们却想用变成数字来使用. 本来用一个json:",string" ...
- golang中的json
编码 结构体生成json 使用json.Marshal()函数可以对一组数据进行json格式的编码. json.Marshal()函数的声明 func Marshal(v interface{}) ( ...
- Jackson 注解 -- 使用 Map存储JSON
我们也可以使用 Map 存储 JSON, 而不用创建对应的对象. package shangbo.jackson.demo16;import java.util.HashMap; import jav ...
- 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 ...
- java中map转为json数据_Java技术-将java中Map类型数据转化为json数据并以Ajax形式返回...
Java技术-将java中Map类型数据转化为json数据并以Ajax形式返回html 1.自定义工具类(简单易用)-下面是我写的一个简单的工具类前端 package com.test.util; i ...
- httpf发送 json_Java用HttpClient3发送http/https协议get/post请求,发送map,json,xml,txt数据...
使用的是httpclient 3.1, 使用"httpclient"4的写法相对简单点,百度:httpclient https post 当不需要使用任何证书访问https网页时, ...
- JS 中 Map 与 JSON 转换
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. JSON数据 转 字符串 JSON.stringify(jsondata) 2. 字符串 转 ...
最新文章
- Matlab与线性代数 -- 魔方矩阵
- 输入字符串中含有该字符的个数
- 积累有价值的seo资源提高网站优化效果
- 【javascript】数据结构-链表
- Property 'submit' of object #HTMLFormElement is not a function
- 消息人士:苹果要求代工商今年生产9000万部iPhone 13
- 从设计门禁系统到为何需要弱电与强电分开呢?
- 空间说说html,适合发空间说说的经典心情短语
- 高德行政区划地图,区域划线,行政区划浏览
- 读取.xls文件报错:XLRDError: Unsupported format, or corrupt file: Expected BOF record; found b‘MIME-Ver
- java订单超时取消设计_订单超时30分钟自动取消
- 解决CSS IOS字体自动调整放大了
- 2022年汽车驾驶员(技师)试题及在线模拟考试
- 百度推广系列之广告词编写必杀技
- 《白夜行》:请让孩子健康成长
- 打造更完美的小程序商城
- 今日头条有意向收购锤子科技;原金立总裁加入小米;苹果应用商店出现查开房记录app|雷锋早报...
- 中图法分类号(计算机专业)和文献标识码
- G2553与F5529串口
- 什么是搬砖套利赚钱模式?
热门文章
- POJ 1949 [最小优先队列]
- 最简单的Windows CE应用程序
- python实现移除某文件夹下所有文件
- 微型计算机机房湿度不宜过大,全国计算机一级考试选择题试题与详细答案(免费)...
- 用windbg调试程序与windbg命令的使用
- [看过不再忘]详细解析chmod修改文件权限
- OSError: [WinError 126] module could not be found(OSError: [WinError 126] 找不到指定的模块)
- css布局Absolute的垂直水平居中
- React.memo 是个啥么鬼?有什么用???
- 编码转换的php小脚本,php编码转换小例子