|
@@ -17,7 +17,9 @@ using System.IO;
|
|
|
|
|
|
namespace Topten.JsonKit
|
|
|
{
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static class Json
|
|
|
{
|
|
|
static Json()
|
|
@@ -32,14 +34,18 @@ namespace Topten.JsonKit
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static bool WriteWhitespaceDefault
|
|
|
{
|
|
|
get;
|
|
|
set;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static bool StrictParserDefault
|
|
|
{
|
|
|
get;
|
|
@@ -47,20 +53,36 @@ namespace Topten.JsonKit
|
|
|
}
|
|
|
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static void Write(TextWriter w, object o, JsonOptions options = JsonOptions.None)
|
|
|
{
|
|
|
var writer = new JsonWriter(w, ResolveOptions(options));
|
|
|
writer.WriteValue(o);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static bool SavePreviousVersions
|
|
|
{
|
|
|
get;
|
|
|
set;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static void WriteFileAtomic(string filename, object o, JsonOptions options = JsonOptions.None, string backupFilename = null)
|
|
|
{
|
|
|
var tempName = filename + ".tmp";
|
|
@@ -132,7 +154,12 @@ namespace Topten.JsonKit
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static void WriteFile(string filename, object o, JsonOptions options = JsonOptions.None)
|
|
|
{
|
|
|
using (var w = new StreamWriter(filename))
|
|
@@ -147,7 +174,12 @@ namespace Topten.JsonKit
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static string Format(object o, JsonOptions options = JsonOptions.None)
|
|
|
{
|
|
|
var sw = new StringWriter();
|
|
@@ -156,7 +188,13 @@ namespace Topten.JsonKit
|
|
|
return sw.ToString();
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static object Parse(TextReader r, Type type, JsonOptions options = JsonOptions.None)
|
|
|
{
|
|
|
JsonReader reader = null;
|
|
@@ -175,13 +213,24 @@ namespace Topten.JsonKit
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static T Parse<T>(TextReader r, JsonOptions options = JsonOptions.None)
|
|
|
{
|
|
|
return (T)Parse(r, typeof(T), options);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static void ParseInto(TextReader r, Object into, JsonOptions options = JsonOptions.None)
|
|
|
{
|
|
|
if (into == null)
|
|
@@ -204,7 +253,13 @@ namespace Topten.JsonKit
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static object ParseFile(string filename, Type type, JsonOptions options = JsonOptions.None)
|
|
|
{
|
|
|
using (var r = new StreamReader(filename))
|
|
@@ -214,6 +269,13 @@ namespace Topten.JsonKit
|
|
|
}
|
|
|
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static T ParseFile<T>(string filename, JsonOptions options = JsonOptions.None)
|
|
|
{
|
|
|
using (var r = new StreamReader(filename))
|
|
@@ -222,7 +284,12 @@ namespace Topten.JsonKit
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static void ParseFileInto(string filename, Object into, JsonOptions options = JsonOptions.None)
|
|
|
{
|
|
|
using (var r = new StreamReader(filename))
|
|
@@ -231,44 +298,80 @@ namespace Topten.JsonKit
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static object Parse(string data, Type type, JsonOptions options = JsonOptions.None)
|
|
|
{
|
|
|
return Parse(new StringReader(data), type, options);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static T Parse<T>(string data, JsonOptions options = JsonOptions.None)
|
|
|
{
|
|
|
return (T)Parse<T>(new StringReader(data), options);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static void ParseInto(string data, Object into, JsonOptions options = JsonOptions.None)
|
|
|
{
|
|
|
ParseInto(new StringReader(data), into, options);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static T Clone<T>(T source)
|
|
|
{
|
|
|
return (T)Reparse(source.GetType(), source);
|
|
|
}
|
|
|
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static object Clone(object source)
|
|
|
{
|
|
|
return Reparse(source.GetType(), source);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static void CloneInto(object dest, object source)
|
|
|
{
|
|
|
ReparseInto(dest, source);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static object Reparse(Type type, object source)
|
|
|
{
|
|
|
if (source == null)
|
|
@@ -292,13 +395,23 @@ namespace Topten.JsonKit
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static T Reparse<T>(object source)
|
|
|
{
|
|
|
return (T)Reparse(typeof(T), source);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static void ReparseInto(object dest, object source)
|
|
|
{
|
|
|
var ms = new MemoryStream();
|
|
@@ -320,82 +433,126 @@ namespace Topten.JsonKit
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static void RegisterFormatter(Type type, Action<IJsonWriter, object> formatter)
|
|
|
{
|
|
|
JsonWriter._formatters[type] = formatter;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static void RegisterFormatter<T>(Action<IJsonWriter, T> formatter)
|
|
|
{
|
|
|
RegisterFormatter(typeof(T), (w, o) => formatter(w, (T)o));
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static void RegisterParser(Type type, Func<IJsonReader, Type, object> parser)
|
|
|
{
|
|
|
JsonReader._parsers.Set(type, parser);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static void RegisterParser<T>(Func<IJsonReader, Type, T> parser)
|
|
|
{
|
|
|
RegisterParser(typeof(T), (r, t) => parser(r, t));
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static void RegisterParser(Type type, Func<object, object> parser)
|
|
|
{
|
|
|
RegisterParser(type, (r, t) => r.ReadLiteral(parser));
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static void RegisterParser<T>(Func<object, T> parser)
|
|
|
{
|
|
|
RegisterParser(typeof(T), literal => parser(literal));
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static void RegisterIntoParser(Type type, Action<IJsonReader, object> parser)
|
|
|
{
|
|
|
JsonReader._intoParsers.Set(type, parser);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static void RegisterIntoParser<T>(Action<IJsonReader, object> parser)
|
|
|
{
|
|
|
RegisterIntoParser(typeof(T), parser);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static void RegisterTypeFactory(Type type, Func<IJsonReader, string, object> factory)
|
|
|
{
|
|
|
JsonReader._typeFactories.Set(type, factory);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static void SetFormatterResolver(Func<Type, Action<IJsonWriter, object>> resolver)
|
|
|
{
|
|
|
JsonWriter._formatterResolver = resolver;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static void SetParserResolver(Func<Type, Func<IJsonReader, Type, object>> resolver)
|
|
|
{
|
|
|
JsonReader._parserResolver = resolver;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
public static void SetIntoParserResolver(Func<Type, Action<IJsonReader, object>> resolver)
|
|
|
{
|
|
|
JsonReader._intoParserResolver = resolver;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
static JsonOptions ResolveOptions(JsonOptions options)
|
|
|
{
|
|
|
JsonOptions resolved = JsonOptions.None;
|