JsonSchemaSerialization
The JSON Schema serialization context holding information about the current serialization.
using Microsoft.Runtime.CompilerServices;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using NJsonSchema.References;
using System;
using System.Threading.Tasks;
namespace NJsonSchema.Infrastructure
{
public class JsonSchemaSerialization
{
[ThreadStatic]
private static SchemaType _currentSchemaType;
[ThreadStatic]
private static bool _isWriting;
[ThreadStatic]
private static JsonSerializerSettings _currentSerializerSettings;
public static SchemaType CurrentSchemaType {
get {
return _currentSchemaType;
}
private set {
_currentSchemaType = value;
}
}
public static JsonSerializerSettings CurrentSerializerSettings {
get {
return _currentSerializerSettings;
}
private set {
_currentSerializerSettings = value;
}
}
public static bool IsWriting {
get {
return _isWriting;
}
private set {
_isWriting = value;
}
}
public static string ToJson(object obj, SchemaType schemaType, IContractResolver contractResolver, Formatting formatting)
{
IsWriting = false;
CurrentSchemaType = schemaType;
JsonSchemaReferenceUtilities.UpdateSchemaReferencePaths(obj, false, contractResolver);
IsWriting = false;
CurrentSerializerSettings = new JsonSerializerSettings {
ContractResolver = contractResolver
};
string data = JsonConvert.SerializeObject(obj, formatting, CurrentSerializerSettings);
CurrentSerializerSettings = null;
CurrentSchemaType = SchemaType.JsonSchema;
return JsonSchemaReferenceUtilities.ConvertPropertyReferences(data);
}
public static async Task<T> FromJsonAsync<T>(string json, SchemaType schemaType, string documentPath, Func<T, JsonReferenceResolver> referenceResolverFactory, IContractResolver contractResolver)
{
CurrentSchemaType = schemaType;
T schema = JsonSchemaSerialization.FromJson<T>(json, contractResolver);
IDocumentPathProvider documentPathProvider = schema as IDocumentPathProvider;
if (documentPathProvider != null)
documentPathProvider.DocumentPath = documentPath;
JsonReferenceResolver jsonReferenceResolver = referenceResolverFactory(schema);
IJsonReference jsonReference = schema as IJsonReference;
if (jsonReference != null && !string.IsNullOrEmpty(documentPath))
jsonReferenceResolver.AddDocumentReference(documentPath, jsonReference);
ConfiguredTaskAwaitable val = AwaitExtensions.ConfigureAwait(JsonSchemaReferenceUtilities.UpdateSchemaReferencesAsync(schema, jsonReferenceResolver, contractResolver), false);
ConfiguredTaskAwaiter val2 = val.GetAwaiter();
if (!val2.get_IsCompleted()) {
await val2;
ConfiguredTaskAwaiter val3 = default(ConfiguredTaskAwaiter);
val2 = val3;
}
val2.GetResult();
CurrentSchemaType = SchemaType.JsonSchema;
return schema;
}
public static T FromJson<T>(string json, IContractResolver contractResolver)
{
IsWriting = true;
CurrentSerializerSettings = new JsonSerializerSettings {
ContractResolver = contractResolver,
MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
ConstructorHandling = ConstructorHandling.Default,
ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
PreserveReferencesHandling = PreserveReferencesHandling.None
};
json = JsonSchemaReferenceUtilities.ConvertJsonReferences(json);
T result = JsonConvert.DeserializeObject<T>(json, CurrentSerializerSettings);
CurrentSerializerSettings = null;
return result;
}
}
}