Libraryless. Click here for Pure Java version (2818L/18K).
sclass JsonDiff { srecord DiffResult(O a, O b) {} // key made from getListKey srecord GatheredKey(S key, O value) { O get() { ret value; } } sclass Removed > DiffResult { *(O *a, O *b) {} } // b missing sclass Added > DiffResult { *(O *a, O *b) {} } // a missing sclass DifferentType > DiffResult { *(O *a, O *b) {} } sclass Different > DiffResult { *(O *a, O *b) {} } // same type, generally different // paths are usually L<String>, but IDs gathered by getListKey can also be in there IF1<L, S> getListKey; // key field for diffing lists. argument is path // returns null if identical O diff(S json1, S json2) { O o1 = jsonDecode(json1), o2 = jsonDecode(json2); ret diff(json1, json2, new L); } // a, b = decoded JSON O diff(O a, O b) { ret diff(a, b, new L); } // a, b = decoded JSON O diff(O a, O b, L path) { if (eq(a, b)) null; if (a == null) ret new Added(a, b); if (b == null) ret new Removed(a, b); if (a.getClass() != b.getClass()) ret new DifferentType(a, b); // from here on, we know that a and b have the same type if (a cast Map) ret diffMaps(a, (Map) b, path); if (a cast L) try object diffLists(a, (L) b, path); ret new Different(a, b); } O diffMaps(Map a, Map b, L path) { ret withoutNullValues (mapKeyAndFunction_lhm(concatAsOrderedSet(keys(a), keys(b)), key -> { temp tempAddToList(path, key); ret diff(a.get(key), b/Map.get(key), path); })); } O diffLists(L a, L b, L path) { S key = callF(getListKey, path); if (key == null) null; Map mapA = gatherListElements(a, key, path); if (mapA == null) null; Map mapB = gatherListElements(b, key, path); if (mapB == null) null; ret diffMaps(mapA, mapB, path); } Map gatherListElements(L l, S key, L path) { new LinkedHashMap mapOut; for (O x : l) { if (!x instanceof Map) ret null with print("Can't get object key " + key + " of non-map (path: " + path + ")"); mapOut.put(new GatheredKey(key, x/Map.get(key)), x); } ret mapOut; } }
download show line numbers debug dex old transpilations
Travelled to 6 computer(s): bhatertpkbcr, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1026301 |
| Snippet name: | JsonDiff |
| Eternal ID of this version: | #1026301/24 |
| Text MD5: | 080d4f10b8b5a7c6ffad2a6c17ae4387 |
| Transpilation MD5: | d87170cd9534f76ee00b78ef35ecf234 |
| Author: | stefan |
| Category: | javax / discord |
| Type: | JavaX fragment (include) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2019-12-15 21:34:31 |
| Source code size: | 2214 bytes / 73 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 591 / 1391 |
| Version history: | 23 change(s) |
| Referenced in: | #1006722 - Transpiler Translator for #759 #1012742 - tok_recordDecls #1032684 - #759 transpilation backup #1034167 - Standard Classes + Interfaces (LIVE, continuation of #1003674) |