Compare two JSON, the ID is a number, processed into a uniform format: only 5 digits after the decimal point is reserved
Package Direct;import Org.json.jsonarray;import Org.json.jsonexception;import org.json.jsonobject;import Org.skyscreamer.jsonassert.jsoncomparemode;import Org.skyscreamer.jsonassert.jsoncompareresult;import Org.skyscreamer.jsonassert.comparator.defaultcomparator;import Org.skyscreamer.jsonassert.jsoncompare;import Java.math.bigdecimal;import java.math.roundingmode;import java.util.hashmap;import java.util.Map;import Static org.skyscreamer.jsonassert.comparator.jsoncompareutil.*;/** * Created by Jenny Zhang on 2017/9/19. */public class Looseyjsoncomparator extends Defaultcomparator {private int scale; String extrainfo;def log; Public Looseyjsoncomparator (jsoncomparemode mode, int scale,string extrainfo,def log) {super (mode); This.scale = Scale;this.extrainfo = Extrainfo;this.log = log; }public static void Assertequals (string expected, string actual, int scale, string extraInfo, Def log) throws Jsonexcepti on {jsoncompareresult result = Jsoncompare.compareJSON (expected, actual, new Looseyjsoncomparator (Jsoncomparemode.lenient,scale,extrainfo,log)); if (result.failed ()) {def failmessage = Result.getmessage (); throw new Assertionerror (ExtraInfo + failmessage); }else{log.info "Pass";} } @Override protected void comparejsonarrayofjsonobjects (String key, Jsonarray expected, Jsonarray actual, Jsoncompa Reresult result) throws Jsonexception {String UniqueKey = Finduniquekey (expected); if (UniqueKey = = NULL | |!isusableasuniquekey (UniqueKey, Actual)) {//an expensive last resort Recu Rsivelycomparejsonarray (key, expected, actual, result); Return }map<object, jsonobject> expectedvaluemap = Arrayofjsonobjecttomap (expected, UniqueKey, log); Map<object, jsonobject> actualvaluemap = Arrayofjsonobjecttomap (actual, UniqueKey, log); For (Object Id:expectedValueMap.keySet ()) {if (!actualvaluemap.containskey (ID)) {resulT.missing (Formatuniquekey (Key, UniqueKey, Expectedvaluemap.get (ID). Get (UniqueKey)), Expectedvaluema P.get (ID)); Continue } jsonobject Expectedvalue = Expectedvaluemap.get (ID); Jsonobject Actualvalue = actualvaluemap.get (ID); Comparevalues (Formatuniquekey (key, UniqueKey, id), Expectedvalue, actualvalue, result); } for (Object Id:actualValueMap.keySet ()) {if (!expectedvaluemap.containskey (ID)) {RE Sult.unexpected (Formatuniquekey (Key, UniqueKey, Actualvaluemap.get (ID). Get (UniqueKey)), Actualvaluemap.get (ID)); }}} Private String Getcomparevalue (string value) {Try{return new BigDecimal (value). Setscale (Scale, Round INGMODE.HALF_UP). toString ();} catch (NumberFormatException e) {return value; Value may = NaN, in this case, return value directly.} } Private Boolean IsNumeric (Object value) {try {double.parsedouble (valuE.tostring ()); return true; } catch (NumberFormatException e) {return false; }} public Map<object, jsonobject> arrayofjsonobjecttomap (jsonarray array, String uniquekey,def log) throws JS onexception {map<object, jsonobject> valueMap = new Hashmap<object, jsonobject> (); for (int i = 0; i < array.length (); ++i) {Jsonobject jsonobject = (jsonobject) array.get (i); Object id = jsonobject.get (uniquekey); id = isnumeric (ID)? Getcomparevalue (Id.tostring ()): ID; Valuemap.put (ID, jsonobject); } return VALUEMAP; } @Override public void comparevalues (String prefix, Object Expectedvalue, Object Actualvalue, Jsoncompareresult Res Ult) throws Jsonexception {if (Areleaf (Expectedvalue, actualvalue)) {if (IsNumeric (expectedvalue) & ;& IsNumeric (Actualvalue)) {if (Getcomparevalue (expectedvalue.tostring ()). Equals (GetcoMparevalue (Actualvalue.tostring ()))) {result.passed (); } else {result.fail (prefix, expectedvalue, actualvalue); } return; }} super.comparevalues (prefix, expectedvalue, actualvalue, result); } Private Boolean Areleaf (Object Expectedvalue, Object Actualvalue) {Boolean isleafexpectedvalue =! ( Expectedvalue instanceof Jsonarray) &&! (Expectedvalue instanceof Jsonobject); Boolean isleafactualvalue =! (Actualvalue instanceof Jsonarray) &&! (Actualvalue instanceof Jsonobject); return isleafexpectedvalue&&isleafactualvalue; }}
[SoapUI] Compare JSON Response