123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
-
- using System;
- using System.Globalization;
- using System.IO;
- using System.Reflection;
- namespace Topten.JsonKit
- {
-
-
-
- [Obfuscation(Exclude=true, ApplyToMembers=true)]
- public interface IJsonReader
- {
-
-
-
-
-
- object Parse(Type type);
-
-
-
-
-
- T Parse<T>();
-
-
-
-
- void ParseInto(object into);
-
-
-
- Token CurrentToken { get; }
-
-
-
-
-
- object ReadLiteral(Func<object, object> converter);
-
-
-
-
-
- void ParseDictionary(Type keyType, Action<object> callback);
-
-
-
-
- void ParseArray(Action callback);
-
-
-
-
- LiteralKind GetLiteralKind();
-
-
-
-
- string GetLiteralString();
-
-
-
- void NextToken();
- }
-
-
-
- public static class IJsonReaderExtensions
- {
-
-
-
-
-
-
- public static T ReadLiteralNumber<T>(this IJsonReader reader)
- {
- return (T)ReadLiteralNumber(reader, typeof(T));
- }
-
-
-
-
-
- public static void ParseDictionary(this IJsonReader reader, Action<string> callback)
- {
- reader.ParseDictionary<string>(callback);
- }
-
-
-
-
-
- public static void ParseDictionary<T>(this IJsonReader reader, Action<T> callback)
- {
- reader.ParseDictionary(typeof(T), (o) => callback((T)o));
- }
-
-
-
-
-
-
- public static object ReadLiteralNumber(this IJsonReader reader, Type type)
- {
- switch (reader.GetLiteralKind())
- {
- case LiteralKind.String:
- var value = Convert.ChangeType(reader.GetLiteralString(), type, CultureInfo.InvariantCulture);
- reader.NextToken();
- return value;
- 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");
- }
- }
- }
|