V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fdgdbr
V2EX  ›  Java

springmvc 返回 json 里面的 map 顺序反掉了

  •  
  •   fdgdbr · 2019-05-21 11:45:48 +08:00 · 6297 次点击
    这是一个创建于 2047 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这是返回之前的对象 https://i.loli.net/2019/05/21/5ce37374e9edc63235.png 这是返回之后 postman 里面数据 https://i.loli.net/2019/05/21/5ce3737b9cb9e16987.png 即使用了 treemap 还是不行,请大佬指教 用的框架是 springboot,版本 2.1.4

    第 1 条附言  ·  2019-05-21 12:38:27 +08:00
    debug 过源码并不是序列化的锅,一直到 outputstream.flush 之前顺序都是对的,采用大佬的建议,改成 list 了
    30 条回复    2019-05-22 00:27:19 +08:00
    fdgdbr
        1
    fdgdbr  
    OP
       2019-05-21 11:46:58 +08:00
    奇怪的是这个 2018 和 2019 里面还是个 map,但是里面的 map 顺序是对的
    kimchan
        2
    kimchan  
       2019-05-21 11:55:00 +08:00
    python 的 map 是无序的. 不是 java 是不是也是因为这个原因
    fireye
        3
    fireye  
       2019-05-21 12:02:07 +08:00
    前端重排序或者 [{},...]
    zvcs
        4
    zvcs  
       2019-05-21 12:06:29 +08:00 via Android
    map 不保证顺序。保证顺序要用 linkhashmap
    wz74666291
        5
    wz74666291  
       2019-05-21 12:06:48 +08:00 via iPhone
    是不是应该用 linkedHashMap 而不是 treeMap 呀
    fhsan
        6
    fhsan  
       2019-05-21 12:13:18 +08:00   ❤️ 1
    返回给前端转换成数组,前端大部分情况下 Map 都不支持有序。
    Aruforce
        7
    Aruforce  
       2019-05-21 12:14:16 +08:00
    @zvcs 第一张图片里面就是 linkedhashmap 啊。。
    估计是 postman 自己的问题...
    geelaw
        8
    geelaw  
       2019-05-21 12:16:04 +08:00 via iPhone
    map 通常没有保持原来 key 顺序的功能。你不应该依赖 JSON 对象里面 key 的顺序,先写后写都是相等的对象。
    iyaozhen
        9
    iyaozhen  
       2019-05-21 12:18:10 +08:00 via Android
    一个 map 什么场景需要顺序呢?
    reus
        10
    reus  
       2019-05-21 12:23:21 +08:00
    这不叫问题,这叫特性

    json 的对象型数据,键就是无序的

    如果想有序,请用数组

    不要想着“解决”这个“问题”,应该修改你的程序,让它不依赖这个顺序
    micean
        11
    micean  
       2019-05-21 12:24:21 +08:00
    treemap 有啥用……
    你的 spring 配置的是 jackson 吗?直接在项目里 autowire objectmapper,把结果打印出来比对一下是不是序列化的锅就知道了
    Citrus
        12
    Citrus  
       2019-05-21 12:24:59 +08:00 via iPhone
    Json 的 Map 本身也是无序的吧,印象中一般的库都不保证顺序的
    micean
        13
    micean  
       2019-05-21 12:26:56 +08:00
    检查下 SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS 这个配置是不是 false
    johnniang
        14
    johnniang  
       2019-05-21 12:41:59 +08:00 via Android
    你可能需要一个 SortedMap
    lululau
        15
    lululau  
       2019-05-21 12:45:27 +08:00   ❤️ 1
    JSON 中没有 Map 这种数据结构,如果你指的是 object 的话,JSON 定义的 object 的键值对是无序的, http://json.org
    watzds
        16
    watzds  
       2019-05-21 13:10:55 +08:00 via Android
    有些时候找到的办法,要想想你的方法是不是完全错了,前提就不对
    watzds
        17
    watzds  
       2019-05-21 13:11:21 +08:00 via Android
    @watzds 有些时候找不到办法,要想想你的方法是不是完全错了,前提就不对
    HuHui
        18
    HuHui  
       2019-05-21 13:13:24 +08:00 via Android
    前段排就完事儿了,别纠结
    beidounanxizi
        19
    beidounanxizi  
       2019-05-21 13:15:12 +08:00 via iPhone
    序列化组件没配置的原因吧,大哥你就这么想,拼接成字符串,你要是写个序列化的 json 组件你怎么写?
    br00k
        20
    br00k  
       2019-05-21 15:45:05 +08:00
    Map 顺序无法保证的。就算你返回的有序,但是客户端处理成字典或对象以后,并不一定会按照你的顺序来。有序还是用 List。
    palmers
        21
    palmers  
       2019-05-21 19:00:52 +08:00
    我觉得就算对象属性顺序是正确的, 使用 Object.keys 顺序也没有保证
    oneisall8955
        22
    oneisall8955  
       2019-05-21 20:01:13 +08:00 via Android
    map 无序呀。。。
    johnj
        23
    johnj  
       2019-05-21 20:26:35 +08:00
    即使在 Java 里有有序的 map,转到 json 就变成无序的了。
    choice4
        24
    choice4  
       2019-05-21 22:29:49 +08:00 via Android
    人家明明是 linkedhashmap 一堆人非要拿 map 无序说事。。
    zhuweiyou
        25
    zhuweiyou  
       2019-05-21 23:13:46 +08:00
    哪怕你 map 顺序是对的。给前端用,对象也是无序的。。。应该用数组返回
    wwqgtxx
        26
    wwqgtxx  
       2019-05-21 23:19:00 +08:00
    我记得在 vue.js 中特别提到了这个问题,js 中的 object 是无序的,所以应该选择使用数组或者是指定一个 id 字段来排序
    cway
        27
    cway  
       2019-05-21 23:33:49 +08:00
    本来就是无序的,如果是用 new JSONObject()的话可以在括号里加个 true 就成有序的了,不写的话默认是 false
    kaneg
        28
    kaneg  
       2019-05-21 23:40:22 +08:00 via iPhone
    通用的 map 的 key 是无序的,这是常识。至于 json 就更是这样了。至于特定的实现保持 key 的顺序或者 key 重排序等,那必须在接口中指定才行,否则一律按照通用 map 对待。
    Navee
        29
    Navee  
       2019-05-22 00:15:37 +08:00
    其实你应该用一个有序的 array 存 key,使用数据时遍历 array 去 map 取 value
    azh7138m
        30
    azh7138m  
       2019-05-22 00:27:19 +08:00 via Android
    @fhsan 嘛,前端可以手动有序,stable 的 stringify 也是不少的,偶尔会用到
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1020 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:17 · PVG 03:17 · LAX 11:17 · JFK 14:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.