10.jmeter jsr223 javascript 深度比对json object
阅读原文时间:2023年07月09日阅读:1
        function sortJSON(data, key, way) {

            //log.info(" " + key + " ------------------- " + typeof(key));  
            return data.sort(function(a, b) {  
                var x = a\[key\]; var y = b\[key\];  
                if (way === '' ) { return ((x < y) ? - : ((x > y) ?  : )); }  
                if (way === '') { return ((x > y) ? - : ((x < y) ?  : )); }  
            });

        }

        function isArray(what) {  
            return Object.prototype.toString.call(what) === '\[object Array\]';  
        }

        var deepequals = function ( x, y ) {  
          if ( x === y ) return true;  
            // if both x and y are null or undefined and exactly the same

          if ( ! ( x instanceof Object ) || ! ( y instanceof Object ) ) return false;  
            // if they are not strictly equal, they both need to be Objects

          if ( x.constructor !== y.constructor ) return false;  
            // they must have the exact same prototype chain, the closest we can do is  
            // test there constructor.  
           // log.info("1111111111111111111111 "+ typeof("payMethod") + "" + Object.keys(x)\[0\] + "" + typeof(Object.keys(x)\[0\]));

        var sortkey2  = "payMethod";

        if(isArray(x) && x.length >  && typeof x\[\] == 'object' &&  Object.keys(x\[\])\[\] === "payMethod" ) {

            //log.info(JSON.stringify(x)+" ======== "+ Object.keys(x));  
            //log.info(JSON.stringify(y)+" ======== "+ Object.keys(y));  
            sortkey2  = Object.keys(x\[\])\[\]; 

         if(isArray(x))   { sortJSON(x,sortkey2, '');}  
         if(isArray(y))   { sortJSON(y,sortkey2, ''); }

            //log.info(JSON.stringify(x)+" ======== "+ Object.keys(x));  
            //log.info(JSON.stringify(y)+" ======== "+ Object.keys(y));  

            }

        //if(sortkey2 == sortkey) log.info("same string " + sortkey);

        // if(isArray(x))    sortJSON(x,'a', '123');  
        // if(isArray(y))    sortJSON(y,'a', '123');

          for ( var p in x ) {

         // log.info(p+":"+ JSON.stringify(x\[p\]) + "  ======  " +  JSON.stringify(y\[p\]));

            if ( ! x.hasOwnProperty( p ) ) continue;  
              // other properties were tested using x.constructor === y.constructor

            if ( ! y.hasOwnProperty( p ) ) { log.info(JSON.stringify(x)+"\\n================属性不一致 ===============\\n"+JSON.stringify(y));  return false; }  
              // allows to compare x\[ p \] and y\[ p \] when set to undefined

            if ( x\[ p \] === y\[ p \] ) continue;  
              // if they have the same strict value or identity then they are equal

            if ( typeof( x\[ p \] ) !== "object" ) {  log.info(JSON.stringify(x)+"\\n================值不一致===============\\n"+JSON.stringify(y));  return false; };  
              // Numbers, Strings, Functions, Booleans must be strictly equal

            if ( ! deepequals( x\[ p \],  y\[ p \] ) ) return false;

              // Objects and Arrays must be tested recursively  
          }

          for ( p in y ) {  
            if ( y.hasOwnProperty( p ) && ! x.hasOwnProperty( p ) )  {  log.info(JSON.stringify(x)+"\\n================反向检查属性不一致===============\\n"+JSON.stringify(y));  return false; };  
              // allows x\[ p \] to be set to undefined  
          }  
          return true;  
        }

        //Object.prototype.deepEquals = deepEquals;

        var beforeObject = JSON.parse(vars.get("83response")); 

        var afterObject = JSON.parse(prev.getResponseDataAsString());

        if(deepequals( beforeObject, afterObject )){

            log.info("deep equals");

        }  
        else{  
            //    log.info(deepequals(testa,testb));  
            AssertionResult.setFailure(true);  
            AssertionResult.setFailureMessage("content not  deep equal ");  
            AssertionResult.setResultForFailure("content not deep equal");  
        }