说到底,json是框架还是啥?实际上它只是一个数据格式,一个规范标准,它永远不会限制实现方的任何 *** 作,即不会自行去保证什么顺序性之类的。json的格式仅由写入数据的一方决定其长相如何。而数据读取一方,则按照json的协议标准进行解析,即可理解原数据的含义。json拥有较为丰富的数据格式,所以对当前应用还是比较友好的。
那么,我们如何处理json的顺序性呢?
1. 保持json有序的思路
首先,我们要澄清有序性的概念:从某种程度上,我们可以把json看作是一个个的kv组成的数据,从这个层面上来讲,我们可以把有序性定义为json的key保持有序,先假设为字典序吧,那么就说这个json数据是有序的。
其次,因为json的数据支持嵌套,所以,我们应该需要保持每一层的数据都有序,才是完整有序的。
ok, 理解完有序的概念,下面我们来看看如何实现有序?
json本身是不可能保持有序了,所以,当我们自行写入json数据时,只需要按照 abcde... 这种key顺序写入数据,那么得到的最终json就是有序的。
但我们一般都是使用对象进行程序变换的,所以,就应该要从对象中取出有序的key, 然后序列化为json.
这里保持有序,至少有两个层面的有序:
kv形式的key的有序;
列表形式的数据有序; 还有其他可能非常复杂的有序性需求,比如按照某字段有序,倒序...
所以,想保持json有序很简单,保证有序写入就可以了。(貌似等于没有说哦)
2. 保持json有序的应用场景举例
为什么要保持json有序呢?json相当于kv数据,一般情况下我们是不需要保证有序的,但有些特殊情况下也许有用。比如我有两份json数据,我想比较它们是否是相等的时候!
比如第一份数据是 {"a":1, "b":2}, 第二份数据是 {"b":2, "a":1}, 那么你说这两份数据是否是相等的呢?相等或不相等依据是啥?
如果对于固定数据结构的json, 那么也许我们可以直接取出每个key的值,然后进行比较,全部相等则相等成立,否则不相等。
但对于json本身就是各种不确定的数据组成,如果我们限制死必须取某些key, 那么这个通用性就很差了。所以,我们要想比较两个json是否相等,还应该要
#Map转json数据出现顺序乱的问题,如果需要保持顺序,可以使用JSONObject 对象的toString()方法;
public static void main(String[] args) {
Map<String, String>map = new LinkedHashMap<String, String>()
map.put("3", "ccccc")
map.put("1", "aaaaa")
map.put("2", "bbbbb")
map.put("4", "ddddd")
System.out.println("默认自动排序")
System.out.println(ResultVOUtil.success(map))
输出结果:
自动排序
{"msg":"成功","code":"0","data":{"1":"aaaaa","2":"bbbbb","3":"ccccc","4":"ddddd"}}
//////////////////////////////////解决方案/////////////////////////////////////////////////////
JSON json = JSONUtil.parse(map)
JSONObject obj = new JSONObject()
obj.put("code", '0')
obj.put("msg", "成功")
obj.put("data", json)
System.out.println("保持原始顺序")
System.out.println(obj.toString())
}
输出结果:
保持原始顺序
{"msg":"成功","code":"0","data":{"3":"ccccc","1":"aaaaa","2":"bbbbb","4":"ddddd"}}
你好!
需要引入fastjson这个jar包,而且版本要高于1.2.3,因为Feature.OrderedField是从1.2.3开始引入的。
import java.util.HashMapimport java.util.LinkedHashMap
import com.alibaba.fastjson.JSONObject
import com.alibaba.fastjson.parser.Feature
public class Test {
public static void main(String[] args) {
JSONObject json = new JSONObject()
String jsonStr = "{\"t1\":\"\",\"t3\":\"\",\"t2\":{\"a1\":\"\",\"a3\":\"\",\"a2\":\"\"}}"
HashMap m= json.parseObject(jsonStr,LinkedHashMap.class,Feature.OrderedField)
System.out.println(m.toString())
}
} 结果:
{t1=, t3=, t2={"a1":"","a3":"","a2":""}}
希望对你有帮助!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)