1
2
3
4
5
6 using System;
7 using System.Collections;
8
9 namespace System.Json
10 {
11 public concept JsonExportable<T>
12 {
13 UniquePtr<JsonValue> T.ToJson();
14 }
15
16 public UniquePtr<JsonValue> ToJson<T>(const T& object)
17 where T is JsonExportable
18 {
19 return object.ToJson();
20 }
21
22 public UniquePtr<JsonValue> ToJson<T>(const UniquePtr<T>& ptr)
23 where T is JsonExportable
24 {
25 if (ptr.IsNull())
26 {
27 return UniquePtr<JsonValue>(new JsonNull());
28 }
29 else
30 {
31 T* p = ptr.Get();
32 UniquePtr<JsonObject> object = new JsonObject();
33 object->AddField("class", UniquePtr<JsonValue>(new JsonString(ToUtf32(typename(*p)))));
34 object->AddField("object", p->ToJson());
35 return UniquePtr<JsonValue>(object.Release());
36 }
37 }
38
39 public UniquePtr<JsonValue> ToJson<T>(const SharedPtr<T>& ptr)
40 where T is JsonExportable
41 {
42 if (ptr.IsNull())
43 {
44 return UniquePtr<JsonValue>(new JsonNull());
45 }
46 else
47 {
48 T* p = ptr.Get();
49 UniquePtr<JsonObject> object = new JsonObject();
50 object->AddField("class", UniquePtr<JsonValue>(new JsonString(ToUtf32(typename(*p)))));
51 object->AddField("object", p->ToJson());
52 return UniquePtr<JsonValue>(object.Release());
53 }
54 }
55
56 public nothrow UniquePtr<JsonValue> ToJson(double value)
57 {
58 return UniquePtr<JsonValue>(new JsonNumber(value));
59 }
60
61 public nothrow UniquePtr<JsonValue> ToJson(bool value)
62 {
63 return UniquePtr<JsonValue>(new JsonBool(value));
64 }
65
66 public nothrow UniquePtr<JsonValue> ToJson<T>(T value)
67 where System.Meta.IsEnumeratedType<T>()
68 {
69 return UniquePtr<JsonValue>(new JsonNumber(cast<double>(cast<T.UnderlyingType>(value))));
70 }
71
72 public UniquePtr<JsonValue> ToJson(const string& value)
73 {
74 return UniquePtr<JsonValue>(new JsonString(ToUtf32(value)));
75 }
76
77 public UniquePtr<JsonValue> ToJson(const wstring& value)
78 {
79 return UniquePtr<JsonValue>(new JsonString(ToUtf32(value)));
80 }
81
82 public nothrow UniquePtr<JsonValue> ToJson(const ustring& value)
83 {
84 return UniquePtr<JsonValue>(new JsonString(value));
85 }
86
87 public nothrow UniquePtr<JsonValue> ToJson(const Date& value)
88 {
89 return UniquePtr<JsonValue>(new JsonString(ToUtf32(value.ToString())));
90 }
91
92 public nothrow UniquePtr<JsonValue> ToJson(const DateTime& value)
93 {
94 return UniquePtr<JsonValue>(new JsonString(ToUtf32(value.ToString())));
95 }
96
97 public nothrow UniquePtr<JsonValue> ToJson(const Timestamp& value)
98 {
99 return UniquePtr<JsonValue>(new JsonString(ToUtf32(value.ToString())));
100 }
101
102 public nothrow UniquePtr<JsonValue> ToJson(const Uuid& value)
103 {
104 return UniquePtr<JsonValue>(new JsonString(ToUtf32(ToString(value))));
105 }
106
107 public UniquePtr<JsonValue> ToJson<T>(const List<T>& value)
108 {
109 UniquePtr<JsonArray> array = new JsonArray();
110 for (const T& item : value)
111 {
112 array->AddItem(ToJson(item));
113 }
114 return UniquePtr<JsonValue>(array.Release());
115 }
116
117 public UniquePtr<JsonValue> ToJson<T>(const Queue<T>& value)
118 {
119 UniquePtr<JsonArray> array = new JsonArray();
120 for (const T& item : value.Rep())
121 {
122 array->AddItem(ToJson(item));
123 }
124 return UniquePtr<JsonValue>(array.Release());
125 }
126
127 public UniquePtr<JsonValue> ToJson<Key, Value, KeyCompare>(const Map<Key, Value, KeyCompare>& value) where Key is ustring
128 {
129 UniquePtr<JsonObject> object = new JsonObject();
130 for (const Pair<Key, Value>& p : value)
131 {
132 object->AddField(p.first, ToJson(p.second));
133 }
134 return UniquePtr<JsonValue>(object.Release());
135 }
136
137 public UniquePtr<JsonValue> ToJson<Key, Value, KeyCompare>(const Map<Key, Value, KeyCompare>& value) where Key is wstring or Key is string
138 {
139 UniquePtr<JsonObject> object = new JsonObject();
140 for (const Pair<Key, Value>& p : value)
141 {
142 object->AddField(ToUtf32(p.first), ToJson(p.second));
143 }
144 return UniquePtr<JsonValue>(object.Release());
145 }
146
147 public UniquePtr<JsonValue> ToJson<K, T, H, C>(const HashMap<K, T, H, C>& value) where K is ustring
148 {
149 UniquePtr<JsonObject> object = new JsonObject();
150 for (const Pair<K, T>& p : value)
151 {
152 object->AddField(p.first, ToJson(p.second));
153 }
154 return UniquePtr<JsonValue>(object.Release());
155 }
156
157 public UniquePtr<JsonValue> ToJson<K, T, H, C>(const HashMap<K, T, H, C>& value) where K is wstring or K is string
158 {
159 UniquePtr<JsonObject> object = new JsonObject();
160 for (const Pair<K, T>& p : value)
161 {
162 object->AddField(ToUtf32(p.first), ToJson(p.second));
163 }
164 return UniquePtr<JsonValue>(object.Release());
165 }
166 }