jsondiff(jsondiffpatch)
本篇文章给大家谈谈jsondiff,以及jsondiffpatch对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、json对比,并标红差异部分
- 2、哪些不能错过的iOS Xcode必备插件
- 3、json工具 json edit 格式化
- 4、diff对比json数据处理数据太慢了
- 5、如何判断两个接口返回的json数据是否有diff
json对比,并标红差异部分
安装依赖
引用依赖
这里不对举迹diff库的详细内容做说明,具中知体可参卖答消考:
本文只针对对比两个json,并标红差异部分的实现做说明
哪些不能错过的iOS Xcode必备插件
Xcode插件神器
插模蚂宽件管理器
第一神器:注释
1.前往GitHub下载工程文件:VVDocumenter-Xcode 2.用Xcode打开工程,Command + B Build成功后,可以在~/Library/Application Support/Developer/Shared/Xcode/Plug-ins目录下看到生成的xcplugin文件: 3.重启Xcode,在某个方法前输入三个“ / ”,自动生成对应的注释: 然后tab并保全就可以了。 4.打开Xcode菜单,在Window选项下可以看到已经安装的插件: 点击打开,可以设置该插件的选项: 感觉还是挺实用的,最重要是安装过程非一般的简单。
第二神器:XVim
第三神器:XToDo
第四神器:Cocoapods
第五神器:DXXcodeConsoleUnicodePlugin
第六神器:FuzzyAutocomplete
第七神器:GitDiff
第八神器:PrettyPrintJSON
第九神器:SCXcodeSwitchExpander
第十神器:Auto-Import
Xcode升级后插件失效解决方案
Xcode插件神器
作为iOS开发人员,不了解些常用的插件,不使用插件,开发效率怎么会够快呢?那么问题来了,现在的你,使用过哪些xcode插件?如果没有使用过插件,那么很遗憾,您错过了很多好用的工具!
插件管理器
既然使用xcode插件,就应该想想有没有插件管理器呢?是的,有一个灰常有名的插件管理器叫Alcatraz,关于这个插件管理器如何安装,请参考官方文档
如果您已经安装过这个插件管理器,那么恭喜您可以直接看下面的内容了!!!
安装完成以后,需要重启Xcode后,然后在Xcode的菜单栏上就可以看到这样package manager:
第一神器:注释
开发必须有规范,不然维护成本就会提高。那么写api时就应该配上非常明确的注释,而有一个插件VVDocument就是一个注释神器。有了它,我们只需要使用///就会自动触发生成格式化的注释。看下面的例子,我们写好这个API后,直接输入/旦亮//,就会生成下面这样的注释!!!当然格式是可以调整的,这个插件提供了一个配置界面,可以修改触发方式以及生成的样式等。
/*!
* @author 黄仪标, 15-11-11 23:11:04
*
* #Description#
*
* @param patientModel #patientModel description#
* @param resultBlock #resultBlock description#
*
* @return #return value description#
*/
- ( instancetype ) initWithPatientModel : ( HYBPatientModel * ) patientModel resultBlock: ( HYBResultBlock ) resultBlock ;
看下图,就是当前我的配置界面,如果想要修改就可以在这个界面直接修改!!!
1.前往GitHub下载工程文件:VVDocumenter-Xcode
2.用Xcode打开工程,Command + B
Build成功后,可以在~/Library/Application Support/Developer/Shared/Xcode/Plug-ins目录下看到生成的xcplugin文件:
3.重启Xcode,在某个方法前输入三个“ / ”,自动生成对应的注释:
然后tab并保全就可以了。
4.打开Xcode菜单,在Window选项下可以看到已经安装的插件:
点击打开,可以设置该插件的选项:
感觉还是挺实用的,最重要是安装过程非一般的简单。
第二神器:XVim
我相信对于做过Web开发的人员,对vim这个工具是相当熟悉的吧。说真的,刚开始我也觉得这个东西不好用,不过那是因为不会用。后来看到有个同事是后端转iOS的,他一直在使用XVim插件操作好快,于是就想学习一下这个东西怎么用。
事实如此,真的是相当棒的插件。现在我的Xcode一直都有这个插件,而且对这个vim已物租经熟悉了,其常用的操作命令都记住了。
现在,本人也在学习HTML5,使用Sublime Text3开发工具,这个也是神器,支持很多的插件,而且也支持vim,简单是爽死了!!!如果您也在使用,一定要学习这个工具如何使用。
如果不想使用Alcatraz插件管理器来插件,可以直接到下载运行。
第三神器:XToDo
首先,其开源github地址为:
如果想要下载运行安装,可以直接下载然后用xcode运行。
我们在开发时,经常使用#warning来添加提醒信息,但是实际上很多项目里面有很多这样的信息,这让我们非常难找。有了XToDo这个神器,我们可以通过这个插件所提供的工具,直接查看。
支持的写法:TODO,FIXME,???,!!!!。看到这几个应该可以猜得出来是什么意思了吧。没错,就是事项的意思。
我们在代码中可以这样添加:
// TODO: 在上线前需要将这个值设置为111(假设)
const NSUInteger kAppInterfaceVersion = 111 ;
// FIXME: 这里是写死的假数据
NSString *title = @"假数据" ;
// ???: 这里是什么意思?
NSString *value = [ self test ] ;
// !!!!: 警告区
NSString *warningVersion = @"1"
第四神器:Cocoapods
现在新的项目中几乎都使用了Cocoapods来管理第三方库了,因此,这个插件也是必备神器啊!关于这个Cocoapods怎么使用,请阅读这篇文章:[),这篇文章介绍了其基本使用,并且也教大家让自己的开源项目也支持`Cocoapods`。
有了这个插件,就可以通过直观的界面来操作了。当然,喜欢使用命令的也是可以的,本人就更喜欢直接操作命令。
第五神器:DXXcodeConsoleUnicodePlugin
你知道吗?为什么Xcode控制台Console打印出来的JSON数据中有中文时都是看不懂的字符?这让人非常难受,只能通过断点调试才能单步进去看到这个值。那么现在有了这个神器就不用这么麻烦了!!!直接就可以打印出来看了!!!
1.快捷键 option+c 会转换当前 剪贴板 中的内容并用一个对话框把转换后的内容显示出来。
2.在 Xcode 的 Edit 菜单中勾选 ConvertUnicodeInConsole,然后 console 中再出现 \u4e0e 时,就会自动转换成 与 显示。
第六神器:FuzzyAutocomplete
这个FuzzyAutocomplete可是相当好用的家伙,可以自动匹配所有的变量、函数名等,而且不要求顺序。比如,Xcode自带的智能提示,我们只能是顺序的写了前面的字符才能匹配出来提示。那么这个神器就不一样了,不要求记得API的写法顺序,只要记住其中几个字母,就可以匹配出来了,然后选择就可以了。
看下图,是不是很明智:
第七神器:GitDiff
对于项目使用了git这个来管理版本的开发人员来说,这可就是一个神器了。我们在文件中发动了任何地方,在左边的代码行号这里都会有相应颜色显示,一看就可以看出来了。
当然,对于不是使用git来管理的人来说,这个插件就没有必要了。
看下图的左边,是不是不一样了:
还可以点击还原:
第八神器:PrettyPrintJSON
开发一定需要到调试接口,那么打印出来的JSON数据又是乱乱的,根本不能直观看出来是什么结构嘛。那么安装这个东西就好办了,直接可以显示出很好的结构。当然我们可以使用浏览器插件:JSON-handle插件,这个是google浏览器的插件,有了这个东西,将接口放到浏览器时,返回的JSON数据会自动格式化。
第九神器:SCXcodeSwitchExpander
这个插件也是好东西哦,当我们定义了枚举结构时,我们使用SCXcodeSwitchExpander插件就相当容易了。
我们定义一个枚举:
typedef NS_ENUM ( NSUInteger , HYBErrorType ) {
kErrorTypeNetworkFail ,
kErrorTypeNetworkTimeout ,
kErrorTypeArgumentLess
}
当我们在使用时,我们声明一个枚举变量,然后输入switch (枚举变量)就会自动地展开了:
HYBErrorType errorType ;
switch ( errorType ) {
case kErrorTypeNetworkFail :
break ;
case kErrorTypeNetworkTimeout :
break ;
case kErrorTypeArgumentLess :
break ;
default :
break ;
}
这是不是很方便呢?必须的!!!
第十神器:Auto-Import
这个Auto-Import插件是可以快速导入头文件的插件。这个就不多说了,看图吧!!!
其实到现在我也没有这么使用过。所以只能排第十了!!!
附上出处链接:{{page}}
json工具 json edit 格式化
主要是你要在option中添加一个value值,比如:
option value="1981"1981/option
在servlet中用 String year = request.getParameter("year"); 就能得团茄到1981年份了。
注意:在页塌和察面中一定要选中1981这一棚知项才能得到该值。
diff对比json数据处理数据太慢了
1、如果如态对比json数据处理的速度太慢,可以考虑使渣搭源用一些更有枝昌效的方法来优化性能,如减少数据量,使用哈希索引优化搜索,以及使用并行处理等技术。
2、此外,可以尝试使用一些特定的工具,如Jiffy或json-diff等,这些工具可以更有效地对比json数据,提高处理效率。
[img]如何判断两个接口返回的json数据是否有diff
背景:在工作中经常会遇到接口迁移,但是呢又需要保证迁移前后返回的数据是一致的,这时候就需要做diff测试
分析:接口返回的json 数据中包含很多类型的字段,例如:object,jsonObject,String,jsonArray等等,因为需要分别几个函数实现:jsonObject,jsonArray,Object的diff
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
public class BasicDiff {
public static class DiffResult{
private Boolean hasDiff = false;
private String diffMessage;
public Boolean getHasDiff() {
return hasDiff;
}
public void setHasDiff(Boolean hasDiff) {
this.hasDiff = hasDiff;
}
public String getDiffMessage() {
return diffMessage;
}
public void setDiffMessage(String diffMessage) {
this.diffMessage = diffMessage;
}
@Override
public String toString() {
return "DiffResult{" +
"hasDiff=" + hasDiff +
", diffMessage='" + diffMessage + '\'' +
'}';
}
}
DiffResult diffResult=new DiffResult();
public DiffResult compareObject(Object oldObject,Object newObject, String key, int index) { if(oldObject == null || newObject == null){
虚祥 diffResult.hasDiff = true;
diffResult.setDiffMessage(key+" 的value中old和new有一个或者两个为null"); return diffResult;
} if(oldObject!=nullnewObject!=null) { if (diffResult.getHasDiff()) { return diffResult;
} 差羡搏 if (oldObject != null newObject != null oldObject.getClass() != newObject.getClass()) {
diffResult.hasDiff = true;
diffResult.setDiffMessage(key + " 的value的old和new 的类型不一致"); return diffResult;
派答 } if (oldObject instanceof JSONObject newObject instanceof JSONObject) {
compareJsonObject((JSONObject) oldObject, (JSONObject) newObject, key, index); if (diffResult.getHasDiff()) { return diffResult;
}
} else if (oldObject instanceof JSONArray newObject instanceof JSONArray) {
compareJsonArray((JSONArray) oldObject, (JSONArray) newObject, key, index); if (diffResult.getHasDiff()) { return diffResult;
}
} else {
String oldStr = oldObject.toString();
String newStr = newObject.toString(); if (!oldStr.equals(newStr)) {
diffResult.hasDiff = true;
diffResult.setDiffMessage("index: " + index + ", " + key + " 的value中old和new 的值不相等"); return diffResult;
}
}
} return diffResult;
} public DiffResult compareJsonArray(JSONArray oldJarr, JSONArray newJarr, String key, int index) { if(diffResult.getHasDiff()){ return diffResult;
} if(oldJarr == null || newJarr == null){
diffResult.hasDiff = true;
diffResult.setDiffMessage(key+" 的value中两个结果存在null"); return diffResult;
} if(oldJarr.size() != newJarr.size()){
diffResult.hasDiff = true;
diffResult.setDiffMessage("index:"+ index+", "+key + " 的value中old和new 数组size不相等"); return diffResult;
} //jsonarray中元素是个object,排序之后再比较
if(oldJarr.size() 0 !(oldJarr.get(0) instanceof JSONObject) !(oldJarr.get(0) instanceof JSONArray)){
String[] arrOld = new String[oldJarr.size()];
String[] arrNew = new String[oldJarr.size()];
ListString tmp = new ArrayListString(); for(int i = 0; i arrOld.length; i++){
arrOld[i] = oldJarr.get(i).toString();
arrNew[i] = newJarr.get(i).toString();
tmp.add(oldJarr.get(i).toString());
}
Arrays.sort(arrOld);
Arrays.sort(arrNew); for(int i = 0; i arrNew.length; i++){ if(!arrOld[i].equals(arrNew[i])){
diffResult.hasDiff = true;
diffResult.setDiffMessage("index:"+ index+", "+key + " 的value中第"+tmp.indexOf(arrOld[i])+"个old和new 值不相等"); return diffResult;
}
}
}else{ for(int i = 0; i oldJarr.size(); i++){ if(oldJarr.get(i) != null newJarr.get(i) != null oldJarr.get(i).getClass()!= newJarr.get(i).getClass()){
diffResult.hasDiff = true;
diffResult.setDiffMessage("index:"+ index+", "+key + " 的value中old和new 的类型不一致"); return diffResult;
} if(oldJarr.get(i) instanceof JSONObject){
JSONObject jold = (JSONObject)oldJarr.get(i);
JSONObject jnew = (JSONObject)newJarr.get(i); if(jold.equals(jnew)){ continue;
}else{
Boolean cd = customHasDiff(oldJarr,newJarr,key,i,diffResult); if(!cd) continue;
compareJsonObject((JSONObject)oldJarr.get(i),(JSONObject)newJarr.get(i),key,i); if(diffResult.getHasDiff()){ return diffResult;
}
}
}else if(oldJarr.get(i) instanceof JSONArray) {
compareJsonArray((JSONArray) oldJarr.get(i), (JSONArray) newJarr.get(i), key, i); if(diffResult.getHasDiff()){ return diffResult;
}
}
}
} return diffResult;
}
public DiffResult compareJsonObject(JSONObject oldJson, JSONObject newJson, String key, int index) {
if(diffResult.getHasDiff()){
return diffResult;
}
if(oldJson == null || newJson == null){
diffResult.hasDiff = true;
diffResult.setDiffMessage(key+" 的value中两个结果存在null");
return diffResult;
}
SetString sold = oldJson.keySet();
SetString snew = newJson.keySet();
if (key.isEmpty()) {
key = "root";
}
//keysize是否相等
if (sold.size() != snew.size()) {
diffResult.hasDiff = true;
diffResult.setDiffMessage(key + " 的keySet的数量不一致,线上有" + sold.size() + "个key,待测服务有" + snew.size() + "个key");
return diffResult;
}
//key是否相同
for (String kold : sold) {
if (!snew.contains(kold)) {
diffResult.hasDiff = true;
diffResult.setDiffMessage("待测服务的" + key + "的keyset不包含" + kold);
return diffResult;
}
}
//value进行校验
for(String kold :sold){
//此处是进行过滤的,如果哪些字段不需要进行diff,就在这里过滤掉,例如接口返回的globalid,每次返回的值都不一样,不需要进行diff
if(kold.equals("globalId")) {
continue;
}
Object oldObject = oldJson.get(kold);
Object newObject = newJson.get(kold);
compareObject(oldObject, newObject, key + "-" + kold, index);
if (diffResult.getHasDiff()) {
return diffResult;
}
}
return diffResult;
}
}
写好了diff比较的工具类就可以用来进行比较了:下面是如何使用的代码
String resultOnline = httpClientTool.doGetNoProxy(onlineUrl, null, "utf-8",headers);
Thread.sleep(100);
String resultNeedDiff=httpClientTool.doGetNoProxy(needDiffUrl,null,"utf-8",headers);
JSONObject resultObject1=JSON.parseObject(resultOnline);
JSONObject resultObject2=JSON.parseObject(resultNeedDiff);
BasicDiff bf=new BasicDiff();
d1=bf.compareObject(resultObject1,resultObject2,"",0)
if(d1.getHasDiff()){
System.out.println("============有diff==========");
System.out.println(d1.getHasDiff());
}
关于jsondiff和jsondiffpatch的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。