|
@@ -13,6 +13,8 @@
|
|
|
|
|
|
|
|
|
using System;
|
|
|
+using System.Globalization;
|
|
|
+using System.IO;
|
|
|
using System.Reflection;
|
|
|
|
|
|
|
|
@@ -85,4 +87,60 @@ namespace Topten.JsonKit
|
|
|
|
|
|
void NextToken();
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ public static class IJsonReaderExtensions
|
|
|
+ {
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ public static T ReadLiteralNumber<T>(this IJsonReader reader)
|
|
|
+ {
|
|
|
+ return (T)ReadLiteralNumber(reader, typeof(T));
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ public static object ReadLiteralNumber(this IJsonReader reader, Type type)
|
|
|
+ {
|
|
|
+ switch (reader.GetLiteralKind())
|
|
|
+ {
|
|
|
+ case LiteralKind.SignedInteger:
|
|
|
+ case LiteralKind.UnsignedInteger:
|
|
|
+ {
|
|
|
+ var str = reader.GetLiteralString();
|
|
|
+ if (str.StartsWith("0x", StringComparison.InvariantCultureIgnoreCase))
|
|
|
+ {
|
|
|
+ var tempValue = Convert.ToUInt64(str.Substring(2), 16);
|
|
|
+ object val = Convert.ChangeType(tempValue, type, CultureInfo.InvariantCulture);
|
|
|
+ reader.NextToken();
|
|
|
+ return val;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ object val = Convert.ChangeType(str, type, CultureInfo.InvariantCulture);
|
|
|
+ reader.NextToken();
|
|
|
+ return val;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ case LiteralKind.FloatingPoint:
|
|
|
+ {
|
|
|
+ object val = Convert.ChangeType(reader.GetLiteralString(), type, CultureInfo.InvariantCulture);
|
|
|
+ reader.NextToken();
|
|
|
+ return val;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ throw new InvalidDataException("expected a numeric literal");
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|