Json串排序
最近遇到个很烦人的问题。我现在做的业务有一部分是把之前app服务端的.net接口转译java接口。但是有些之前的接口,一个接口干上十几件事情,返回的json串长达五六几百行。着实看的就让人头大。但是如果返回的json串和原来的对不上,那app客户端就无法正常显示,人工去对比那是耗时耗力。所以我就想找一个程序,能把json串格式化好,然后按字段名称排好序,在逐行进行对比,就能很快就能找出不同比人工要快无数倍。找了半天也没法发现合适的。于是只好自己写一个。这个工具主要的思路是,将json串格式化并根据key值排好序,理论上相同的字段都排在相同的位置,然后根据这个去逐行进行比较,如果不相同就标为红色。如果相同就不变,试用了下,效果还不错,所以拿出来分享,希望大家都不用加班。哈哈
其中遇到一个坑fastjson 中带的字段排序总不能很好的解决我的问题,排序总有问题。所以我就自己写了一段方法进行排序。
private Map<String, Object> sortField(Map<String, Object> map){
//new 一个排序的Map 在构造方法中传入比较器
Map<String, Object> treeMap = new TreeMap<>(new MapComparator());
for (Map.Entry<String, Object> entry : map.entrySet()){
Object value = entry.getValue();
//去掉空和空字符串
if (value == null || (value instanceof String && StringUtils.isBlank((String) value))){
continue;
}
//判断是不是 JSONObject 如果是转化成TreeMap
if (value instanceof JSONObject){
//JSONObject 覆写了toString 所有可以直接调用toString
treeMap.put(entry.getKey(), sortField(JSON.parseObject(value.toString(), Map.class)));
//判断是不是 JSONArray
}else if (value instanceof JSONArray){
//如果是 强转成 JSONArray 并且遍历它
JSONArray jsonArray = (JSONArray) value;
List<Object> list = new ArrayList<>(jsonArray.size());
for (Object object : jsonArray){
//判断里面的是否是 JSONObject 如果是转化成TreeMap
if (object instanceof JSONObject){
object = sortField(JSON.parseObject(object.toString(), Map.class));
}
//其他基础类型直接放进去
list.add(object);
}
//list 排序方便比较
list.sort(new ListComparator());
treeMap.put(entry.getKey(), list);
}else {
//其他基础类型直接放进去
treeMap.put(entry.getKey(), value);
}
}
return treeMap;
}
class MapComparator implements Comparator<String> {
@Override
public int compare(String str1, String str2) {
return str1.compareTo(str2);
}
}
class ListComparator implements Comparator<Object> {
@Override
public int compare(Object o1, Object o2) {
//因为这里面不是基础类型就是Map 或者他们的 map的toString方法被复写过 会把所有的key和value组合拼接成字符串
//比如 map.put("key":"value"); toString 会变成 {"key":"value"}
String str1 = o1.toString();
String str2 = o2.toString();
//获得其字符串长度
Integer length1= str1.length();
Integer length2 = str2.length();
//先比较其长度
int i = length1.compareTo(length2);
//如果长度相同 在比较实际字符串
if (i == ){
return str1.compareTo(str2);
}
return i;
}
}
该方法接受一个由json串转化成的map。
Map<String, Object> treeMap = sortField(JSON.parseObject(json, Map.class));
这样调用即可。
下面是这个小工具的github地址,如果有需要的可以下来用用。主要是对json串排序,然后逐行比较
https://github.com/RaidenXin/json-comparator
也可以直接下载,在装有java环境的机器上可执行的jar包 升级版 0.0.3
https://files.cnblogs.com/files/Raiden-xin/json_comparator_jar.zip
如有转载请说明来处,谢谢
Json串排序的更多相关文章
- 利用QJSON将FDQuery转成JSON串
服务器要支持Http协议,打算采用Http+JSON的方式来交换数据.一开始考虑使用superobject,因为以前使用比较多,比较熟悉. 代码如下: class function FDQueryTo ...
- iOS 字典或者数组和JSON串的转换
在和服务器交互过程中,会iOS 字典或者数组和JSON串的转换,具体互换如下: // 将字典或者数组转化为JSON串 + (NSData *)toJSONData:(id)theData { NSEr ...
- [原创] C# dynamic拼接Json串
using Newtonsoft.Json; 之前拼接两个json串,是用的这样的代码 , json1.Length - ); json2 = json2.Insert(json2 - , tmp); ...
- spring入门(七)【springMVC返回json串】
现在多数的应用为了提高交互性多使用异步刷新,即在不刷新整个页面的情况下,只刷新局部,局部刷新用得最多就是ajax,ajax和后台进行交互的数据格式使用的最多的是JSON,这里简单描述,在springm ...
- java对象与json串互转
1:java对象与json串转换: java对象—json串: JSONObject JSONStr = JSONObject.fromObject(object); String str = JSO ...
- spring 4.x下让http请求返回json串
当前很多应用已经开始将响应返回为json串,所以基于springframework框架开发的服务端程序,让响应返回json字符串成为了一种常用手段. 这里介绍一下如何在spring-MVC框架下方便快 ...
- curl运行json串,代理转发格式
curl -b 'uin=o0450654733; skey=@tq9xjRvYy' -H "Content-Type: application/json" -X POST -d ...
- 使用FastJSON,将对象或数组和JSON串互转
Fastjson,是阿里巴巴提供的一个Java语言编写的高性能功能完善的JSON库.其开源的下载网址为:https://github.com/AlibabaTech/fastjson. 示例代码如下: ...
- 怎么解析json串在.net中
以前知道一种解析json串的方法,觉得有点麻烦.就从别的地方搜到了另一种 string json = vlt.getlist(); JObject jo = JObject.Parse(json); ...
随机推荐
- UltraEdit实现“删除包含某个关键字的所有行”
原文:UltraEdit实现"删除包含某个关键字的所有行" UltraEdit实现"删除包含某个关键字的所有行" 1.Ctrl+R调出"替换对话框 ...
- 八荣八耻 IT版
八荣八耻 IT版以可配置为荣,以硬编码为耻:以系统互备为荣,以系统单点为耻:以随时可重启为荣,以不能迁移为耻:以整体交付为荣,以部分交付为耻:以无状态为荣,以有状态为耻:以标准化为荣,以特殊化为耻:以 ...
- Linux ACL对某一些文件有管理权限
某些系统账号希望对某一些文件有管理权限,有三种方法: 1 加入属主所在的同一个组中,这等于扩大了访问其他文件的权限了. 2 加入other中,这样权限放开的更大了. 3 给文件的sudo权限. 4 采 ...
- 16.09 working note
这个月最主要任务是linux shell script学习. 其次是继续spring源码学习. 其余时间C.C++和Java学习. 01 9月第一天,9点多才到家.做道简单的oj题练习下.因为简单,所 ...
- SQL Server上唯一的数据库集群:负载均衡、读写分离、容灾(数据零丢失、服务高可用)
SQL Server上唯一的数据库集群:负载均衡.读写分离.容灾(数据零丢失.服务高可用).审计.优化,全面解决数据库用户问题.一键安装,易用稳定,性价比高,下载链接:http://www.zheti ...
- UWP-消息提示(仿Android)
原文:UWP-消息提示(仿Android) 在UWP中的消息提示框(一)中介绍了一些常见的需要用户主动去干涉的一些消息提示框,接下来打算聊聊不需要用户主动去干涉的一些消息提示框.效果就是像双击退出的那 ...
- ASP.NET MVC控制器Controller
控制器的定义 MVC模式下的控制器(Controller)主要负责响应用户的输入,并且在响应时可能的修改模型(Model). 之前的URL访问,通常是通过指定服务器的路径来实现,如访问URL:http ...
- DELPHI之关于String的内存分配(引)
在函数.过程或者方法中定义一个字符串变量时,由于我们知道在函数.过程或者方法中定义的变量为局部变量,它的内存 是在栈中分配的,但是这里有个小细节我们要注意,对于一个局部的字符串变量,它的大小为4字节, ...
- IntelliJ IDEA Maven工程保证JDK版本不变
创建maven项目后修改pom文件idea会默认将jdk版本调回到1.5,这是因为没有在pom里面设置项目的jdk版本 解决方法: 在pom文件中设定jdk版本即可,以下这种写法会自动更新idea中的 ...
- nginx 配置https并自签名证书
2016-10-28 转载请注明出处:http://daodaoliang.com/ 作者: daodaoliang 版本: V1.0.1 邮箱: daodaoliang@yeah.net 参考链接: ...