最近在项目开发过程中遇到这样一个需求:
需要给前端提供一个接口,该接口返回数据类型为JSONObject对象,且其中的每个键值对都必须固定。
这是第一次遇到这种位置固定的情况,我们都知道,JSONObject本质是用HashMap实现的,而HashMap是散列的,是链式存储结构。
HashMap的存储过程,根据该元素自身提供的hashcode计算出散列值(在这一点上,就可以知道,元素放进去的位置是无法确定的,只有在获取hashcode后才知道),该值就是数组的下标,然后将该元素放入数组位置的链表中。
为了实现这一功能,在网上找到了两种解决办法。
1、使用构造函数com.alibaba.fastjson.JSONObject.JSONObject(boolean ordered),其中,参数代表是否排序;根据我的需求,我传了一个参数true。
JSONObject json = new JSONObject(true);
2、使用构造函数com.alibaba.fastjson.JSONObject.JSONObject(Map<String, Object> map),其中参数指定一个双向链表合二为一的LinkedHashMap,虽然LinkedHashMap存储数据时增加了时间和空间上的开销,但是考虑到我的需求数据量不大,因此也可以考虑该方法。
JSONObject json = new JSONObject(new LinkedHashMap<>());