V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
fdgdbr
V2EX  ›  Java

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

  •  
  •   fdgdbr · May 21, 2019 · 7079 views
    This topic created in 2542 days ago, the information mentioned may be changed or developed.

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

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

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

    如果想有序,请用数组

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