Libraryless. Click here for Pure Java version (4010L/23K).
| 1 | scope jsonDecode | 
| 2 | |
| 3 | sO jsonDecode(S text) {
 | 
| 4 | ret new Y(text).parse(); | 
| 5 | } | 
| 6 | |
| 7 | // the miraculous class Y | 
| 8 | sclass #Y {
 | 
| 9 | S text; | 
| 10 | LS tok; | 
| 11 | bool useOrderedMaps; | 
| 12 | int i = 1; | 
| 13 | |
| 14 |   *(S *text) {
 | 
| 15 | tok = jsonTok(text); | 
| 16 | } | 
| 17 | |
| 18 |   swappable RuntimeException fail(S msg) { ret main fail(msg); }
 | 
| 19 | |
| 20 |   O parse() {
 | 
| 21 | if (l(tok) == 1) null; | 
| 22 | ret parseExpr(); | 
| 23 | } | 
| 24 | |
| 25 |   O parseExpr() {
 | 
| 26 | String t = tok.get(i); | 
| 27 |     if (t.startsWith("\"") || t.startsWith("'")) {
 | 
| 28 | String s = unquote(tok.get(i)); | 
| 29 | i += 2; | 
| 30 | return s; | 
| 31 | } | 
| 32 |     if (t.equals("{"))
 | 
| 33 | return parseMap(); | 
| 34 |     if (t.equals("["))
 | 
| 35 | return this.parseList(); // avoid loading standard function "parseList" | 
| 36 |     if (t.equals("null")) {
 | 
| 37 | i += 2; return null; | 
| 38 | } | 
| 39 |     if (t.equals("false")) {
 | 
| 40 | i += 2; return false; | 
| 41 | } | 
| 42 |     if (t.equals("true")) {
 | 
| 43 | i += 2; return true; | 
| 44 | } | 
| 45 | bool minus = false; | 
| 46 |     if (t.equals("-")) {
 | 
| 47 | minus = true; | 
| 48 | i += 2; | 
| 49 | t = get(tok, i); | 
| 50 | } | 
| 51 |     if (isInteger(t)) {
 | 
| 52 | int j = i; | 
| 53 | i += 2; | 
| 54 |       if (eqOneOf(get(tok, i), ".", "e", "E")) {
 | 
| 55 | // rough parsing for doubles | 
| 56 | while (isInteger(get(tok, i)) | 
| 57 | || eqOneOf(get(tok, i), ".", "e", "E", "-")) | 
| 58 | i += 2; | 
| 59 | double d = parseDouble(joinSubList(tok, j, i-1)); | 
| 60 | if (minus) d = -d; | 
| 61 | ret d; | 
| 62 |       } else {
 | 
| 63 | long l = parseLong(t); | 
| 64 | ret boxedIntOrLong(minus ? -l : l); | 
| 65 | } | 
| 66 | } | 
| 67 | |
| 68 |     fail("Unknown token " + (i+1) + ": " + t + ": " + text);
 | 
| 69 | } | 
| 70 | |
| 71 |   Object parseList() {
 | 
| 72 |     consume("[");
 | 
| 73 | List list = new ArrayList; | 
| 74 |     while (!tok.get(i).equals("]")) {
 | 
| 75 | list.add(parseExpr()); | 
| 76 |       if (tok.get(i).equals(",")) i += 2;
 | 
| 77 | } | 
| 78 |     consume("]");
 | 
| 79 | return list; | 
| 80 | } | 
| 81 | |
| 82 |   Object parseMap() {
 | 
| 83 |     consume("{");
 | 
| 84 | Map map = useOrderedMaps ? new LinkedHashMap : new TreeMap; | 
| 85 |     while (!tok.get(i).equals("}")) {
 | 
| 86 | String key = unquote(tok.get(i)); | 
| 87 | i += 2; | 
| 88 |       consume(":");
 | 
| 89 | Object value = parseExpr(); | 
| 90 | map.put(key, value); | 
| 91 |       if (tok.get(i).equals(",")) i += 2;
 | 
| 92 | } | 
| 93 |     consume("}");
 | 
| 94 | return map; | 
| 95 | } | 
| 96 | |
| 97 |   void consume(String s) {
 | 
| 98 |     if (!tok.get(i).equals(s)) {
 | 
| 99 | S prevToken = i-2 >= 0 ? tok.get(i-2) : ""; | 
| 100 | S nextTokens = join(tok.subList(i, Math.min(i+4, tok.size()))); | 
| 101 |       fail(quote(s) + " expected: " + prevToken + " " + nextTokens + " (" + i + "/" + tok.size() + ")");
 | 
| 102 | } | 
| 103 | i += 2; | 
| 104 | } | 
| 105 | } | 
download show line numbers debug dex old transpilations
Travelled to 18 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, ekrmjmnbrukm, gwrvuhgaqvyk, irmadwmeruwu, ishqpsrjomds, lpdgvwnxivlt, mowyntqkapby, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt, xrpafgyirdlv
| ID | Author/Program | Comment | Date | 
|---|---|---|---|
| 509 | #1000604 (pitcher) | 2015-08-18 19:07:10 | 
| Snippet ID: | #1000620 | 
| Snippet name: | jsonDecode function (super-simple JSON decoder in JavaX!) | 
| Eternal ID of this version: | #1000620/19 | 
| Text MD5: | 4990d6435ff1be87a0aa7f5129349783 | 
| Transpilation MD5: | 0b9fabbd728483bd6d6837ca600e9941 | 
| Author: | stefan | 
| Category: | javax | 
| Type: | JavaX fragment (include) | 
| Public (visible to everyone): | Yes | 
| Archived (hidden from active list): | No | 
| Created/modified: | 2021-10-01 23:27:14 | 
| Source code size: | 2503 bytes / 105 lines | 
| Pitched / IR pitched: | No / No | 
| Views / Downloads: | 1819 / 3665 | 
| Version history: | 18 change(s) | 
| Referenced in: | [show references] |