JsonSchemaSerialization
The JSON Schema serialization context holding information about the current serialization.
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.IO;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
namespace NJsonSchema.Infrastructure
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
public class JsonSchemaSerialization
{
[ThreadStatic]
private static SchemaType _currentSchemaType;
[ThreadStatic]
private static bool _isWriting;
[System.Runtime.CompilerServices.Nullable(2)]
[ThreadStatic]
private static JsonSerializerSettings _currentSerializerSettings;
public static SchemaType CurrentSchemaType {
get {
return _currentSchemaType;
}
private set {
_currentSchemaType = value;
}
}
[System.Runtime.CompilerServices.Nullable(2)]
public static JsonSerializerSettings CurrentSerializerSettings {
[System.Runtime.CompilerServices.NullableContext(2)]
get {
return _currentSerializerSettings;
}
[System.Runtime.CompilerServices.NullableContext(2)]
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 result = JsonConvert.SerializeObject(obj, formatting, CurrentSerializerSettings);
CurrentSerializerSettings = null;
CurrentSchemaType = SchemaType.JsonSchema;
return result;
}
[Obsolete("Use FromJsonAsync with cancellation token instead.")]
public static Task<T> FromJsonAsync<T>(string json, SchemaType schemaType, [System.Runtime.CompilerServices.Nullable(2)] string documentPath, Func<T, JsonReferenceResolver> referenceResolverFactory, IContractResolver contractResolver)
{
return FromJsonAsync(json, schemaType, documentPath, referenceResolverFactory, contractResolver, CancellationToken.None);
}
public static Task<T> FromJsonAsync<T>(string json, SchemaType schemaType, [System.Runtime.CompilerServices.Nullable(2)] string documentPath, Func<T, JsonReferenceResolver> referenceResolverFactory, IContractResolver contractResolver, CancellationToken cancellationToken = default(CancellationToken))
{
Func<T> loader = () => JsonSchemaSerialization.FromJson<T>(json, contractResolver);
return FromJsonWithLoaderAsync(loader, schemaType, documentPath, referenceResolverFactory, contractResolver, cancellationToken);
}
public static Task<T> FromJsonAsync<T>(Stream stream, SchemaType schemaType, [System.Runtime.CompilerServices.Nullable(2)] string documentPath, Func<T, JsonReferenceResolver> referenceResolverFactory, IContractResolver contractResolver, CancellationToken cancellationToken = default(CancellationToken))
{
Func<T> loader = () => JsonSchemaSerialization.FromJson<T>(stream, contractResolver);
return FromJsonWithLoaderAsync(loader, schemaType, documentPath, referenceResolverFactory, contractResolver, cancellationToken);
}
[AsyncStateMachine(typeof(<FromJsonWithLoaderAsync>d__16<>))]
private static Task<T> FromJsonWithLoaderAsync<T>(Func<T> loader, SchemaType schemaType, [System.Runtime.CompilerServices.Nullable(2)] string documentPath, Func<T, JsonReferenceResolver> referenceResolverFactory, IContractResolver contractResolver, CancellationToken cancellationToken)
{
<FromJsonWithLoaderAsync>d__16<T> stateMachine = default(<FromJsonWithLoaderAsync>d__16<T>);
stateMachine.<>t__builder = AsyncTaskMethodBuilder<T>.Create();
stateMachine.loader = loader;
stateMachine.schemaType = schemaType;
stateMachine.documentPath = documentPath;
stateMachine.referenceResolverFactory = referenceResolverFactory;
stateMachine.contractResolver = contractResolver;
stateMachine.cancellationToken = cancellationToken;
stateMachine.<>1__state = -1;
stateMachine.<>t__builder.Start(ref stateMachine);
return stateMachine.<>t__builder.Task;
}
[return: System.Runtime.CompilerServices.Nullable(2)]
public static T FromJson<[System.Runtime.CompilerServices.Nullable(2)] T>(string json, IContractResolver contractResolver)
{
IsWriting = true;
UpdateCurrentSerializerSettings<T>(contractResolver);
try {
return JsonConvert.DeserializeObject<T>(json, CurrentSerializerSettings);
} finally {
CurrentSerializerSettings = null;
}
}
[return: System.Runtime.CompilerServices.Nullable(2)]
public static T FromJson<[System.Runtime.CompilerServices.Nullable(2)] T>(Stream stream, IContractResolver contractResolver)
{
IsWriting = true;
UpdateCurrentSerializerSettings<T>(contractResolver);
try {
using (StreamReader reader = new StreamReader(stream))
using (JsonTextReader reader2 = new JsonTextReader(reader)) {
JsonSerializer jsonSerializer = JsonSerializer.Create(CurrentSerializerSettings);
return jsonSerializer.Deserialize<T>(reader2);
}
} finally {
CurrentSerializerSettings = null;
}
}
private static void UpdateCurrentSerializerSettings<[System.Runtime.CompilerServices.Nullable(2)] T>(IContractResolver contractResolver)
{
CurrentSerializerSettings = new JsonSerializerSettings {
ContractResolver = contractResolver,
MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
ConstructorHandling = ConstructorHandling.Default,
ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
PreserveReferencesHandling = PreserveReferencesHandling.None,
MaxDepth = new int?(128)
};
}
}
}