-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathJSON.sc
79 lines (67 loc) · 1.39 KB
/
JSON.sc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
JSON {
classvar <tab,<nl;
*initClass {
tab = [$\\,$t].as(String);
nl = [$\\,$n].as(String);
}
*stringify { arg obj, force=false;
var out;
out = try { obj.toJSON } {
("No JSON conversion for object" + obj).warn;
};
^out
}
}
JSONEncodeError : Error {
var <>type;
*new {
|obj|
var new = super.new;
new.type = obj.class;
}
}
+Object { toJSON { JSONEncodeError(this).throw }}
+Nil { toJSON { ^"null" }}
+True { toJSON { ^"true" }}
+False { toJSON { ^"false" }}
+String {
toJSON {
^this.asCompileString.replace("\n", JSON.nl).replace("\t", JSON.tab);
}
}
+Symbol {
toJSON {
^JSON.stringify(this.asString)
}
}
+Dictionary {
toJSON {
var out = List.new;
this.keysValuesDo({ arg key, value;
out.add( key.asString.asCompileString ++ ":" + JSON.stringify(value) );
});
^("{" ++ (out.join(",")) ++ "}");
}
}
+Number {
toJSON {
if(this.isNaN, {
^"NaN"
});
if(this === inf, {
^"Infinity"
});
if(this === (-inf), {
^"-Infinity"
});
^this.asString
}
}
+SequenceableCollection {
toJSON {
^"[" ++ this.collect({ arg sub;
JSON.stringify(sub)
}).join(",")
++ "]";
}
}