引言

为什么要自己重新造轮子,而不是采用第三方的JsonSchema方法进行实现
存在以下痛点:
1.我之前在网上找了很久,没有找到java版直接进行jsonschema生成的方法或直接比较的方法
2.http://JSONschema.net/#/home 使用这块框架,必须要先把我们的Json信息复制到该网页,然后通过该网页生成的jsonschema格式文件写到本地,效率实在过于低下
3.其次我相信很多人都已经实现这块方法,但一直没有开源出来,在此小弟做个抛砖引玉

设计思路

1.比较JSON的Value值是否匹配(在我个人看来有一定价值,但还不够,会引发很多不必要但错误)
2.能比较null值,比如 期望json中某个值是有值的,而实际json虽然存在这个key,但它的value是null
3.能比较key值是否存在
4.能比较jsonArray;

其中针对jsonArray要展开说明下;
1.对于jsonArray内所有的jsonObject数据肯定是同一类型的,因此我这边做的是只比较jsonArray的第一个JsonObject
2.对于jsonArray,大家可能会关心期望长度和实际长度是否有差异

总的而言,采用递归思路进行实现

现在直接附上代码,已实现generateJsonSchema方法直接把json信息 转换成jsonschema,再结合比对函数diffFormatJson,自动校验jsonschema

  1. package com.testly.auto.core;
  2. import net.sf.json.JSONArray;
    import net.sf.json.JSONObject;
    import org.junit.Test;
  3. import java.util.Iterator;
  4. /**
    * Created by 古月随笔 on 2017/6/23.
    */
    public class DiffMethod {
  5. /**
    * 返回当前数据类型
    * @param source
    * @return
    */
    public String getTypeValue(Object source){
  6. if(source instanceof String){
    return "String";
    }
  7. if(source instanceof Integer){
    return "Integer";
    }
  8. if(source instanceof Float){
    return "Float";
    }
  9. if(source instanceof Long){
    return "Long";
    }
  10. if(source instanceof Double){
    return "Double";
    }
  11. if(source instanceof Date){
    return "Date";
    }
  12. if(source instanceof Boolean){
    return "Boolean";
    }
  13. return "null";
    }
  14. /**
    * 把Object变成JsonSchema
    * @param source
    * @return
    */
    public Object generateJsonSchema(Object source){
  15. Object result = new Object();
  16. //判断是否为JsonObject
    if(source instanceof JSONObject){
    JSONObject jsonResult = JSONObject.fromObject(result);
    JSONObject sourceJSON = JSONObject.fromObject(source);
    Iterator iterator = sourceJSON.keys();
    while (iterator.hasNext()){
    String key = (String) iterator.next();
    Object nowValue = sourceJSON.get(key);
  17. if(nowValue == null || nowValue.toString().equals("null")){
    jsonResult.put(key,"null");
  18. }else if(isJsonObject(nowValue)){
    jsonResult.put(key,generateJsonSchema(nowValue));
    }else if(isJsonArray(nowValue)){
    JSONArray tempArray = JSONArray.fromObject(nowValue);
    JSONArray newArray = new JSONArray();
  19. if(tempArray != null && tempArray.size() > 0 ){
    for(int i = 0 ;i < tempArray.size(); i++){
    newArray.add(generateJsonSchema(tempArray.get(i)));
    }
    jsonResult.put(key,newArray);
    }
    }else if(nowValue instanceof List){
    List<Object> newList = new ArrayList<Object>();
  20. for(int i = 0;i<((List) nowValue).size();i++){
    newList.add(((List) nowValue).get(i));
    }
  21. jsonResult.put(key,newList);
    }else {
  22. jsonResult.put(key,getTypeValue(nowValue));
    }
  23. }
    return jsonResult;
    }
  24. if(source instanceof JSONArray){
    JSONArray jsonResult = JSONArray.fromObject(source);
    JSONArray tempArray = new JSONArray();
    if(jsonResult != null && jsonResult.size() > 0){
    for(int i = 0 ;i < jsonResult.size(); i++){
    tempArray.add(generateJsonSchema(jsonResult.get(i)));
    }
    return tempArray;
    }
  25. }
  26. return getTypeValue(source);
  27. }
  28. /**
    * JSON格式比对
    * @param currentJSON
    * @param expectedJSON
    * @return
    */
    public JSONObject diffJson(JSONObject currentJSON,JSONObject expectedJSON){
  29. JSONObject jsonDiff = new JSONObject();
  30. Iterator iterator = expectedJSON.keys();
  31. while (iterator.hasNext()){
    String key = (String)iterator.next();
    Object expectedValue = expectedJSON.get(key);
    Object currentValue = currentJSON.get(key);
    if(!expectedValue.toString().equals(currentValue.toString())){
    JSONObject tempJSON = new JSONObject();
    tempJSON.put("value",currentValue);
    tempJSON.put("expected",expectedValue);
    jsonDiff.put(key,tempJSON);
    }
    }
    return jsonDiff;
    }
  32. /** * 判断是否为JSONObject * @param value * @return */
  33. public boolean isJsonObject(Object value){
  34. try{
    if(value instanceof JSONObject) {
    return true;
    }else {
    return false;
    }
    }catch (Exception e){
    return false;
    }
    }
  35. /** * 判断是否为JSONArray * @param value * @return */
  36. public boolean isJsonArray(Object value){
  37. try{
  38. if(value instanceof JSONArray){
    return true;
    }else {
    return false;
    }
  39. }catch (Exception e){
    return false;
    }
    }
  40. /** * JSON格式比对,值不能为空,且key需要存在 * @param current * @param expected * @return */
  41. public JSONObject diffFormatJson(Object current,Object expected){
  42. JSONObject jsonDiff = new JSONObject();
  43. if(isJsonObject(expected)) {
  44. JSONObject expectedJSON = JSONObject.fromObject(expected);
    JSONObject currentJSON = JSONObject.fromObject(current);
  45. Iterator iterator = JSONObject.fromObject(expectedJSON).keys();
  46. while (iterator.hasNext()) {
    String key = (String) iterator.next();
    Object expectedValue = expectedJSON.get(key);
  47. if (!currentJSON.containsKey(key)) {
    JSONObject tempJSON = new JSONObject();
    tempJSON.put("actualKey", "不存在此" + key);
    tempJSON.put("expectedKey", key);
    jsonDiff.put(key, tempJSON);
  48. }
  49. if (currentJSON.containsKey(key)) {
  50. Object currentValue = currentJSON.get(key);
  51. if (expectedValue != null && currentValue == null || expectedValue.toString() != "null" && currentValue.toString() == "null") {
    JSONObject tempJSON = new JSONObject();
    tempJSON.put("actualValue", "null");
    tempJSON.put("expectedValue", expectedValue);
    jsonDiff.put(key, tempJSON);
    }
  52. if (expectedValue != null && currentValue != null) {
    if (isJsonObject(expectedValue) && !JSONObject.fromObject(expectedValue).isNullObject() || isJsonArray(expectedValue) && !JSONArray.fromObject(expectedValue).isEmpty()) {
    JSONObject getResultJSON = new JSONObject();
    getResultJSON = diffFormatJson(currentValue, expectedValue);
    if (getResultJSON != null) {
    jsonDiff.putAll(getResultJSON);
    }
    }
    }
    }
    }
    }
  53. if(isJsonArray(expected)){
    JSONArray expectArray = JSONArray.fromObject(expected);
    JSONArray currentArray = JSONArray.fromObject(current);
  54. if(expectArray.size() != currentArray.size()){
    JSONObject tempJSON = new JSONObject();
    tempJSON.put("actualLenth",currentArray.size());
    tempJSON.put("expectLenth",expectArray.size());
    jsonDiff.put("Length",tempJSON);
    }
  55. if(expectArray.size() != 0){
    Object expectIndexValue = expectArray.get(0);
    Object currentIndexValue = currentArray.get(0);
  56. if(expectIndexValue != null && currentIndexValue != null){
    if (isJsonObject(expectIndexValue) && !JSONObject.fromObject(expectIndexValue).isNullObject() || isJsonArray(expectIndexValue) && !JSONArray.fromObject(expectIndexValue).isEmpty()) {
    JSONObject getResultJSON = new JSONObject();
    getResultJSON = diffFormatJson(currentIndexValue, expectIndexValue);
    if (getResultJSON != null) {
    jsonDiff.putAll(getResultJSON);
    }
    }
    }
    }
    }
  57. return jsonDiff;
    }
    }

测试验证:


  1. public static void main(String[] args) {
  2. DiffMethod diffMethod = new DiffMethod();
  3. String str1 = "{\"status\":201,\"msg\":\"今天您已经领取过,明天可以继续领取哦!\",\"res\":{\"remainCouponNum\":\"5\",\"userId\":\"123123213222\"}}";
  4. JSONObject jsonObject1 = JSONObject.fromObject(str1);
  5. String str2 = "{\"status\":201,\"msg2\":\"今天您已经领取过,明天可以继续领取哦!\",\"res\":{\"remainCouponNum\":\"5\",\"userId\":\"123123213222\"}}";
  6. JSONObject jsonObject2 = JSONObject.fromObject(str2);
  7. String str3 = "{\"status\":null,\"msg\":\"今天您已经领取过,明天可以继续领取哦!\",\"res\":{\"remainCouponNum\":\"5\",\"userId\":\"123123213222\"}}";
  8. JSONObject jsonObject3 = JSONObject.fromObject(str3);
  9. System.out.println("转换成JSONschame:" + diffMethod.generateJsonSchema(jsonObject1).toString());
  10. System.out.println("当前str2没有msg字段: " + diffMethod.diffFormatJson(jsonObject2,jsonObject1).toString());
  11. System.out.println("当前str2中的status为null值:" + diffMethod.diffFormatJson(jsonObject3,jsonObject1).toString());
  12. }

测试结果:

  1. 转换成JSONschame:{"status":"Integer","msg":"String","res":{"remainCouponNum":"String","userId":"String"}}
    当前str2没有msg字段: {"msg":{"actualKey":"不存在此msg","expectedKey":"msg"}}
    当前str2中的statusnull值:{"status":{"actualValue":null,"expectedValue":201}}

[JsonSchema] 关于接口测试 Json 格式比对核心算法实现 (Java 版)的更多相关文章

  1. curl中通过json格式吧post值返回到java中遇到中文乱码的问题

    首先是: curl中模拟http请求: curl -l 127.0.0.1:8080/spacobj/core/do?acid=100 -H "token:101hh" -H &q ...

  2. 如何把一些字符串用dict组织成json格式?(小算法)

    说明: 1. 数据库中的一条记录取出来是这样的(直接复制):'value1','value2' ,'value3' 2. 我希望使用的数据格式是:{key1:'value1',key2:'value2 ...

  3. Java中将JSON格式的数据转换成对应的Bean、Map、List数据

    简单说明: 为了方便数据在客户端及服务器端的传输,有时候我们会用一些比较方便组织的数据类型,比如json.xml等传给客户端,客户端也可以重新组织数据传回服务器端.JSON和XML提供了一套比较方便的 ...

  4. java 解析json格式数据(转)

    2012-07-30 16:43:54|  分类: java |  标签:java  json  |举报|字号 订阅     有时候我们可能会用到json格式的数据进行数据的传输,那么我们怎么把接收到 ...

  5. robot framework 接口测试 http协议post请求json格式

    robot framework 接口测试 http协议post请求json格式 讲解一个基础版本.注意区分url地址和uri地址. rf和jmeter在添加服务器地址也就是ip地址的时候,只能url地 ...

  6. 如何识别一个字符串是否Json格式

    前言: 距离上一篇文章,又过去一个多月了,近些时间,工作依旧很忙碌,除了管理方面的事,代码方面主要折腾三个事: 1:开发框架(一整套基于配置型的开发体系框架) 2:CYQ.Data 数据层框架(持续的 ...

  7. SQLyog-直接导出JSON格式的数据

          前言:以前做过的一个项目,有这样的一个需求使用搜索引擎来查询对应的区域信息,不过区域信息要先导出来,并且数据格式是JSON格式的,在程序中能实现这个需求,不过下面的这种方法更加的简单,通过 ...

  8. Web API删除JSON格式的文件记录

    Insus.NET的系列Web Api学习文章,这篇算是计划中最后一篇了,删除JSON格式的文件记录.前一篇<Web Api其中的PUT功能演示>http://www.cnblogs.co ...

  9. jmeter随笔(1)-在csv中数据为json格式的数据不完整

    昨天同事在使用jmeter遇到问题,在csv中数据为json格式的数据,在jmeter中无法完整的取值,小怪我看了下,给出解决办法,其实很简单,我们一起看看,看完了记得分享给你的朋友. 问题现象: 1 ...

随机推荐

  1. 判断PDF文件是否相同(通过二进制流判断)

    一.Java代码 1.将PDF转为字节流    /*     * @step     *  1.使用BufferedInputStream和FileInputStream从File指定的文件中读取内容 ...

  2. 【IDEA填坑】springboot整合ssm框架

    遇到俩问题:一个是mybatis生疏  在EmpMapper.xml中定义resultMap <resultMap id="EmpWithDept" type="c ...

  3. JeasyUI,导出Excel

    这个是客户端表格导出伪Excel文档. 不知道为啥,超过200条,不能导出,显示网络错误 $.extend($.fn.datagrid.methods, { //超过200条,不能导出,显示网络错误? ...

  4. spring的配置与使用

    spring的配置与使用 一.Spring介绍 1. 什么是Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由 RodJohnson 在其著 ...

  5. var that = this 小坑记

    在js编码过程中,经常会使用如上的语句来规避拿不到变量的问题. 比如: queryData:function () { var that=this; var param={}; for(var key ...

  6. 性能测试遭遇TPS抖动问题

    目前性能测试组正在对独立秒杀进行性能压测,性能抖动特别厉害. 由于独立秒杀的接口大多数是经过volicity渲染过的页面和数据的整合,所以在压测的时候有很多volicity的错误.初步判定,感觉是vo ...

  7. 二叉树之AVL树

    高度为 h 的 AVL 树,节点数 N 最多2^h − 1: 最少N(h)=N(h− 1) +N(h− 2) + 1. 最少节点数n 如以斐波那契数列可以用数学归纳法证明: 即: N(0) = 0 ( ...

  8. csv文件读写处理

    csv文件读写处理   1.读取 第一种:   import csv with open("route.csv","r") as f: #reader是一个迭代 ...

  9. Python_Mix*匿名函数,sorted,filter,map,递归函数,二分法查找

    lambda匿名函数(函数名统一都叫lambda) 为了解决简单的需求而设计的一句话函数 语法: lambda 参数 返回值 n = lambda a,b: max(a,b) ret = n(9,4) ...

  10. 【教程】CRX格式插件不能离线安装?本地扩展CRX无法安装怎么办?

    http://www.cnplugins.com/zhuanti/how-to-make-crx-install.html