为什么 @ResponseBody 返回的排序 LinkedHashMap 是无序的?

3

以下是 SpringMVC 控制器代码片段:

@RequestMapping(value = "/getCityList", method = RequestMethod.POST)
public @ResponseBody LinkedHashMap<String, String> getCityList(@RequestParam(value = "countryCode") String countryCode, HttpServletRequest request) throws Exception {
    //gets ordered city list of country  [sorted by city name]
    LinkedHashMap<String, String> cityList = uiOperationsService.getCityList(countryCode); 

    for (String s : cityList.values()) {
        System.out.println(s); //prints sorted list  [sorted by name]
    }
    return cityList;
}

以下是ajax调用:

function fillCityList(countryCode) {
        $.ajax({
            type: "POST",
            url: '/getCityList',
            data: {countryCode:countryCode},
            beforeSend:function(){
                $('#city').html("<option value=''>-- SELECT --</option>" );
            }
        }).done(function (data) {

            console.log(data); // UNSORTED JSON STRING  [Actually sorted by key... not by city name]

        })
    }

为什么从getCityList方法返回的已排序的LinkedHashMap在返回过程中变成了未排序的JSON对象?这是为什么呢? 是否因为ResponseBody注解将LinkedHashMap转换为HashMap? 我可以通过Gson库将我的已排序对象转换为JSON字符串,并从我的getCityList方法返回JSON字符串,但我不喜欢这个解决方案。 我该怎么做才能向JavaScript回调方法提供已排序列表呢?

2个回答

8
您希望JSON对象的条目和LinkedHashMap条目具有相同的顺序,但这不会发生,因为JavaScript对象键没有固有的顺序。它们就像Java HashMaps一样。如果您需要一个保持顺序的JavaScript数据结构,应使用数组,而不是对象。从您的方法中返回已排序的List<City>,其中City具有键和值。

我不喜欢在我的方法中使用List,因为我的jstl序列化使用LinkedHashMap:<form:options items="${cityList}"></form:options>。但是我认为不情愿地应该例外,并将返回ajax调用响应的方法中的LinkedHashMap转换为List。 - yuceel

0
如果您想发送排序数据,则传递您的对象或城市的List作为已排序数据的List<City>
当我在我的应用程序中使用HashMap时,我也遇到了同样的问题,它不能保证以我们添加它们的相同顺序接收它们。我们必须通过其键来访问它。
因此,最好使用List而不是LinkedHashMap
大多数JSON实现都不会努力保留对象的name/value对的顺序,因为(按定义)这不重要。

你确定LinkedHashMap的插入顺序吗?Java文档提供了不同的建议:http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html - Shailendra
@Shailendra:请查看http://java.dzone.com/articles/hashmap-vs-treemap-vs#highlighter_525587,其中有示例。 - user3145373 ツ
“实现 JSON”是什么意思?JSON 是一种格式。 - a better oliver
是的,这是一个格式问题,我只是在谈论当我们使用它时,JSON中的顺序不会被保留。请参考https://dev59.com/hW855IYBdhLWcg3wJQrT - user3145373 ツ
@user3145373:你提到的那篇文章也指出,“LinkedHashMap 保留插入顺序”,就像 Java 文档所述。 - Shailendra
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接