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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
// generated file, do not modify!
// {{ dateTime }}
package {{ moduleName }};
import java.util.ArrayList;
import java.util.HashMap;
import org.json.*;
import RT.*;
{% for m in imports %}
import {{ m.value }}.*;
{% endfor %}
public class JSON {
// JSON deserializer
public enum Type { {% for t in usedTypes %}
{{ t.value | typeEnum }}{% if !t.last %},{% endif %}{% endfor %}
}
public static Object fromJSON(Type type, Object rawObj) throws JSONException, Exception {
switch (type) {
{% for t in usedTypes %}
{% case t.value.tag %}
{% when "Data" %}
{% when "V2" %}
case {{ t.value | typeEnum }}: {
JSONObject obj = (JSONObject)rawObj;
return new {{ t.value | javaType }}
( ({{ t.value.type_ | javaType }})fromJSON(Type.{{ t.value.type_ | typeEnum }},obj.get("x"))
, ({{ t.value.type_ | javaType }})fromJSON(Type.{{ t.value.type_ | typeEnum }},obj.get("y"))
);
}
{% when "V3" %}
case {{ t.value | typeEnum }}: {
JSONObject obj = (JSONObject)rawObj;
return new {{ t.value | javaType }}
( ({{ t.value.type_ | javaType }})fromJSON(Type.{{ t.value.type_ | typeEnum }},obj.get("x"))
, ({{ t.value.type_ | javaType }})fromJSON(Type.{{ t.value.type_ | typeEnum }},obj.get("y"))
, ({{ t.value.type_ | javaType }})fromJSON(Type.{{ t.value.type_ | typeEnum }},obj.get("z"))
);
}
{% when "V4" %}
case {{ t.value | typeEnum }}: {
JSONObject obj = (JSONObject)rawObj;
return new {{ t.value | javaType }}
( ({{ t.value.type_ | javaType }})fromJSON(Type.{{ t.value.type_ | typeEnum }},obj.get("x"))
, ({{ t.value.type_ | javaType }})fromJSON(Type.{{ t.value.type_ | typeEnum }},obj.get("y"))
, ({{ t.value.type_ | javaType }})fromJSON(Type.{{ t.value.type_ | typeEnum }},obj.get("z"))
, ({{ t.value.type_ | javaType }})fromJSON(Type.{{ t.value.type_ | typeEnum }},obj.get("w"))
);
}
{% when "Map" %}
/*
case {{ t.value | typeEnum }}: {
var map = new {{ t.value | javaType }} ();
foreach(var i in (JSONObject)rawObj) {
map.Add( ({{ t.value.key_ | javaType }})fromJSON(Type.{{ t.value.key_ | typeEnum }},i.Key)
, ({{ t.value.value_ | javaType }})fromJSON(Type.{{ t.value.value_ | typeEnum }},i.Value));
}
return map;
}
*/
{% when "Array" %}
// case {{ t.value | typeEnum }}: return ((JArray)obj).Select(x => fromJSON (Type.{{ t.value.type_ | typeEnum }}, x)).ToList();
{% when "List" %}
// case {{ t.value | typeEnum }}: return ((JArray)obj).Select(x => fromJSON (Type.{{ t.value.type_ | typeEnum }}, x)).ToList();
{% when "Maybe" %}
/*
case {{ t.value | typeEnum }}: {
var m = new {{ t.value | javaType }} ();
if (obj == null || obj.Type == JTokenType.Null) {
m.valid = false;
} else {
m.valid = true;
m.data = ({{ t.value.type_ | javaType }})fromJSON (Type.{{ t.value.type_ | typeEnum }},obj);
}
return m;
}
*/
{% else %}
case {{ t.value | typeEnum }}: return ({{ t.value | javaType }})rawObj;
{% endcase %}
{% endfor %}
{% for t in definitions %}
case {{ t.value.dataName }}: {
JSONObject obj = (JSONObject)rawObj;
String tag = obj.getString("tag");
{% if t.value | hasEnumConstructor %}
{{ t.value.dataName }}.Tag tagType;
{% endif %}
switch (tag) {
{% for c in t.value.constructors %}
case "{{ c.value.name }}":{% if (c.value.fields | empty) %} tagType = {{ t.value.dataName }}.Tag.{{ c.value.name }}; break;
{% else %} {
{{ t.value.dataName }}.{{ c.value.name }}_ tv = new {{ t.value.dataName }}().new {{ c.value.name }}_();{% for f in c.value.fields %}{% if c.value.fields | hasFieldNames %}
tv.{{ f.value.fieldName }} = ({{ f.value.fieldType | javaType }})fromJSON(Type.{{ f.value.fieldType | typeEnum }},obj.get("{{ f.value.fieldName }}"));{% else %}
tv._{{ f.index0 }} = ({{ f.value.fieldType | javaType }})fromJSON(Type.{{ f.value.fieldType | typeEnum }},obj.get("arg{{ f.index0 }}"));{% endif %}{% endfor %}
return tv;
}
{% endif %}
{% endfor %}
default: throw new Exception("unknown constructor: " + tag);
}
{% if t.value | hasEnumConstructor %}
{{ t.value.dataName }} o = new {{ t.value.dataName }}();
o.tag = tagType;
return o;
{% endif %}
}
{% endfor %}
}
throw new Exception("unknown type");
}
}
|