2 using System.Collections;
3 using System.Collections.Generic;
4 using System.Globalization;
7 using System.Runtime.Serialization.Json;
10 using JsonPair = System.Collections.Generic.KeyValuePair<string, System.Json.JsonValue>;
15 public abstract class JsonValue : IEnumerable
17 public static JsonValue Load (Stream stream)
20 throw new ArgumentNullException ("stream");
21 return Load (new StreamReader (stream, true));
24 public static JsonValue Load (TextReader textReader)
26 if (textReader == null)
27 throw new ArgumentNullException ("textReader");
29 var ret = new JavaScriptReader (textReader, true).Read ();
31 return ToJsonValue (ret);
34 static IEnumerable<KeyValuePair<string,JsonValue>> ToJsonPairEnumerable (IEnumerable<KeyValuePair<string,object>> kvpc)
36 foreach (var kvp in kvpc)
37 yield return new KeyValuePair<string,JsonValue> (kvp.Key, ToJsonValue (kvp.Value));
40 static IEnumerable<JsonValue> ToJsonValueEnumerable (IEnumerable<object> arr)
42 foreach (var obj in arr)
43 yield return ToJsonValue (obj);
46 static JsonValue ToJsonValue (object ret)
50 var kvpc = ret as IEnumerable<KeyValuePair<string,object>>;
52 return new JsonObject (ToJsonPairEnumerable (kvpc));
53 var arr = ret as IEnumerable<object>;
55 return new JsonArray (ToJsonValueEnumerable (arr));
58 return new JsonPrimitive ((bool) ret);
60 return new JsonPrimitive ((byte) ret);
62 return new JsonPrimitive ((char) ret);
64 return new JsonPrimitive ((decimal) ret);
66 return new JsonPrimitive ((double) ret);
68 return new JsonPrimitive ((float) ret);
70 return new JsonPrimitive ((int) ret);
72 return new JsonPrimitive ((long) ret);
74 return new JsonPrimitive ((sbyte) ret);
76 return new JsonPrimitive ((short) ret);
78 return new JsonPrimitive ((string) ret);
80 return new JsonPrimitive ((uint) ret);
82 return new JsonPrimitive ((ulong) ret);
84 return new JsonPrimitive ((ushort) ret);
86 return new JsonPrimitive ((DateTime) ret);
87 if (ret is DateTimeOffset)
88 return new JsonPrimitive ((DateTimeOffset) ret);
90 return new JsonPrimitive ((Guid) ret);
92 return new JsonPrimitive ((TimeSpan) ret);
94 return new JsonPrimitive ((Uri) ret);
95 throw new NotSupportedException (String.Format ("Unexpected parser return type: {0}", ret.GetType ()));
98 public static JsonValue Parse (string jsonString)
100 if (jsonString == null)
101 throw new ArgumentNullException ("jsonString");
102 return Load (new StringReader (jsonString));
105 public virtual int Count {
106 get { throw new InvalidOperationException (); }
109 public abstract JsonType JsonType { get; }
111 public virtual JsonValue this [int index] {
112 get { throw new InvalidOperationException (); }
113 set { throw new InvalidOperationException (); }
116 public virtual JsonValue this [string key] {
117 get { throw new InvalidOperationException (); }
118 set { throw new InvalidOperationException (); }
121 public virtual bool ContainsKey (string key)
123 throw new InvalidOperationException ();
126 public virtual void Save (Stream stream)
129 throw new ArgumentNullException ("stream");
130 Save (new StreamWriter (stream));
133 public virtual void Save (TextWriter textWriter)
135 if (textWriter == null)
136 throw new ArgumentNullException ("textWriter");
137 SaveInternal (textWriter);
140 void SaveInternal (TextWriter w)
143 case JsonType.Object:
145 bool following = false;
146 foreach (JsonPair pair in ((JsonObject) this)) {
150 w.Write (EscapeString (pair.Key));
152 if (pair.Value == null)
155 pair.Value.SaveInternal (w);
163 foreach (JsonValue v in ((JsonArray) this)) {
174 case JsonType.Boolean:
175 w.Write ((bool) this ? "true" : "false");
177 case JsonType.String:
179 w.Write (EscapeString (((JsonPrimitive) this).GetFormattedString ()));
183 w.Write (((JsonPrimitive) this).GetFormattedString ());
188 public override string ToString ()
190 StringWriter sw = new StringWriter ();
192 return sw.ToString ();
195 IEnumerator IEnumerable.GetEnumerator ()
197 throw new InvalidOperationException ();
200 internal string EscapeString (string src)
205 for (int i = 0; i < src.Length; i++)
206 if (src [i] == '"' || src [i] == '\\') {
207 var sb = new StringBuilder ();
209 sb.Append (src, 0, i);
210 return DoEscapeString (sb, src, i);
215 string DoEscapeString (StringBuilder sb, string src, int cur)
218 for (int i = cur; i < src.Length; i++)
219 if (src [i] == '"' || src [i] == '\\') {
220 sb.Append (src, start, i - start);
225 sb.Append (src, start, src.Length - start);
226 return sb.ToString ();
231 public static implicit operator JsonValue (bool value)
233 return new JsonPrimitive (value);
236 public static implicit operator JsonValue (byte value)
238 return new JsonPrimitive (value);
241 public static implicit operator JsonValue (char value)
243 return new JsonPrimitive (value);
246 public static implicit operator JsonValue (decimal value)
248 return new JsonPrimitive (value);
251 public static implicit operator JsonValue (double value)
253 return new JsonPrimitive (value);
256 public static implicit operator JsonValue (float value)
258 return new JsonPrimitive (value);
261 public static implicit operator JsonValue (int value)
263 return new JsonPrimitive (value);
266 public static implicit operator JsonValue (long value)
268 return new JsonPrimitive (value);
271 public static implicit operator JsonValue (sbyte value)
273 return new JsonPrimitive (value);
276 public static implicit operator JsonValue (short value)
278 return new JsonPrimitive (value);
281 public static implicit operator JsonValue (string value)
283 return new JsonPrimitive (value);
286 public static implicit operator JsonValue (uint value)
288 return new JsonPrimitive (value);
291 public static implicit operator JsonValue (ulong value)
293 return new JsonPrimitive (value);
296 public static implicit operator JsonValue (ushort value)
298 return new JsonPrimitive (value);
301 public static implicit operator JsonValue (DateTime value)
303 return new JsonPrimitive (value);
306 public static implicit operator JsonValue (DateTimeOffset value)
308 return new JsonPrimitive (value);
311 public static implicit operator JsonValue (Guid value)
313 return new JsonPrimitive (value);
316 public static implicit operator JsonValue (TimeSpan value)
318 return new JsonPrimitive (value);
321 public static implicit operator JsonValue (Uri value)
323 return new JsonPrimitive (value);
328 public static implicit operator bool (JsonValue value)
331 throw new ArgumentNullException ("value");
332 return Convert.ToBoolean (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
335 public static implicit operator byte (JsonValue value)
338 throw new ArgumentNullException ("value");
339 return Convert.ToByte (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
342 public static implicit operator char (JsonValue value)
345 throw new ArgumentNullException ("value");
346 return Convert.ToChar (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
349 public static implicit operator decimal (JsonValue value)
352 throw new ArgumentNullException ("value");
353 return Convert.ToDecimal (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
356 public static implicit operator double (JsonValue value)
359 throw new ArgumentNullException ("value");
360 return Convert.ToDouble (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
363 public static implicit operator float (JsonValue value)
366 throw new ArgumentNullException ("value");
367 return Convert.ToSingle (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
370 public static implicit operator int (JsonValue value)
373 throw new ArgumentNullException ("value");
374 return Convert.ToInt32 (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
377 public static implicit operator long (JsonValue value)
380 throw new ArgumentNullException ("value");
381 return Convert.ToInt64 (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
384 public static implicit operator sbyte (JsonValue value)
387 throw new ArgumentNullException ("value");
388 return Convert.ToSByte (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
391 public static implicit operator short (JsonValue value)
394 throw new ArgumentNullException ("value");
395 return Convert.ToInt16 (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
398 public static implicit operator string (JsonValue value)
402 return (string) ((JsonPrimitive) value).Value;
405 public static implicit operator uint (JsonValue value)
408 throw new ArgumentNullException ("value");
409 return Convert.ToUInt16 (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
412 public static implicit operator ulong (JsonValue value)
415 throw new ArgumentNullException ("value");
416 return Convert.ToUInt64(((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
419 public static implicit operator ushort (JsonValue value)
422 throw new ArgumentNullException ("value");
423 return Convert.ToUInt16 (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
426 public static implicit operator DateTime (JsonValue value)
429 throw new ArgumentNullException ("value");
430 return (DateTime) ((JsonPrimitive) value).Value;
433 public static implicit operator DateTimeOffset (JsonValue value)
436 throw new ArgumentNullException ("value");
437 return (DateTimeOffset) ((JsonPrimitive) value).Value;
440 public static implicit operator TimeSpan (JsonValue value)
443 throw new ArgumentNullException ("value");
444 return (TimeSpan) ((JsonPrimitive) value).Value;
447 public static implicit operator Guid (JsonValue value)
450 throw new ArgumentNullException ("value");
451 return (Guid) ((JsonPrimitive) value).Value;
454 public static implicit operator Uri (JsonValue value)
457 throw new ArgumentNullException ("value");
458 return (Uri) ((JsonPrimitive) value).Value;