// actually it's now almost the same as jsonDecode :)
static Object unstructure(String text) {
final L<S> tok = javaTok(text);
class X {
int i = 1;
Object parse() {
String t = tok.get(i);
if (t.startsWith("\"")) {
String s = unquote(tok.get(i));
i += 2;
return s;
}
if (t.equals("{"))
return parseMap();
if (t.equals("["))
return parseList();
if (t.equals("null")) {
i += 2; return null;
}
if (t.equals("false")) {
i += 2; return false;
}
if (t.equals("true")) {
i += 2; return true;
}
if (isInteger(t)) {
i += 2; return Long.parseLong(t);
}
if (isJavaIdentifier(t)) {
Class c = findClass(t);
O o = nuObject(c);
i += 2;
if (i < tok.size() && tok.get(i).equals("(")) {
consume("(");
while (!tok.get(i).equals(")")) {
// It's like parsing a map.
//Object key = parse();
//if (tok.get(i).equals(")"))
// key = onlyField();
String key = unquote(tok.get(i));
i += 2;
consume("=");
Object value = parse();
set(o, key, value);
if (tok.get(i).equals(",")) i += 2;
}
consume(")");
}
return o;
}
throw new RuntimeException("Unknown token " + (i+1) + ": " + t);
}
Object parseList() {
consume("[");
List list = new ArrayList;
while (!tok.get(i).equals("]")) {
list.add(parse());
if (tok.get(i).equals(",")) i += 2;
}
consume("]");
return list;
}
Object parseMap() {
consume("{");
Map map = new TreeMap;
while (!tok.get(i).equals("}")) {
String key = unquote(tok.get(i));
i += 2;
consume("=");
Object value = parse();
map.put(key, value);
if (tok.get(i).equals(",")) i += 2;
}
consume("}");
return map;
}
void consume(String s) {
if (!tok.get(i).equals(s)) {
S prevToken = i-2 >= 0 ? tok.get(i-2) : "";
S nextTokens = join(tok.subList(i, Math.min(i+4, tok.size())));
fail(quote(s) + " expected: " + prevToken + " " + nextTokens + " (" + i + "/" + tok.size() + ")");
}
i += 2;
}
}
return new X().parse();
}Began life as a copy of #1000620
download show line numbers debug dex old transpilations
Travelled to 13 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1001061 |
| Snippet name: | OLD unstructure (opposite of "structure") - restores data structures from a string |
| Eternal ID of this version: | #1001061/1 |
| Text MD5: | 51d37397a4d175a0854d1b93c59cd3b7 |
| Author: | stefan |
| Category: | javax |
| Type: | JavaX fragment (include) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2015-10-28 18:03:18 |
| Source code size: | 2506 bytes / 93 lines |
| Pitched / IR pitched: | No / Yes |
| Views / Downloads: | 1160 / 1225 |
| Referenced in: | #1001355 - unstructure (opposite of "structure") - restores data structures from a string (old) #3000382 - Answer for ferdie (>> t = 1, f = 0) #3000383 - Answer for funkoverflow (>> t=1, f=0 okay) |