JsonSchemaSerialization
The JSON Schema serialization context holding information about the current serialization.
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;
public static SchemaType CurrentSchemaType {
get {
return _currentSchemaType;
}
private set {
_currentSchemaType = value;
}
}
public static bool IsWriting {
get {
return _isWriting;
}
private set {
_isWriting = value;
}
}
[Obsolete("This overload will be removed soon.")]
public static string ToJson(object obj, SchemaType schemaType, IContractResolver contractResolver)
{
return ToJson(obj, schemaType, contractResolver, Formatting.Indented);
}
public static string ToJson(object obj, SchemaType schemaType, IContractResolver contractResolver, Formatting formatting)
{
IsWriting = false;
CurrentSchemaType = schemaType;
JsonSchemaReferenceUtilities.UpdateSchemaReferencePaths(obj, false, contractResolver);
return JsonSchemaReferenceUtilities.ConvertPropertyReferences(JsonConvert.SerializeObject(obj, formatting, new JsonSerializerSettings {
ContractResolver = contractResolver
}));
}
public static async Task<T> FromJsonAsync<T>(string json, SchemaType schemaType, string documentPath, Func<T, JsonReferenceResolver> referenceResolverFactory, IContractResolver contractResolver)
{
IsWriting = true;
CurrentSchemaType = schemaType;
json = JsonSchemaReferenceUtilities.ConvertJsonReferences(json);
JsonSerializerSettings settings = new JsonSerializerSettings {
ContractResolver = contractResolver,
MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
ConstructorHandling = ConstructorHandling.Default,
ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
PreserveReferencesHandling = PreserveReferencesHandling.Objects
};
T schema = JsonConvert.DeserializeObject<T>(json, settings);
IDocumentPathProvider documentPathProvider;
if ((documentPathProvider = (schema as IDocumentPathProvider)) != null)
documentPathProvider.DocumentPath = documentPath;
JsonReferenceResolver jsonReferenceResolver = referenceResolverFactory(schema);
IJsonReference schema2;
if ((schema2 = (schema as IJsonReference)) != null && !string.IsNullOrEmpty(documentPath))
jsonReferenceResolver.AddDocumentReference(documentPath, schema2);
await JsonSchemaReferenceUtilities.UpdateSchemaReferencesAsync(schema, jsonReferenceResolver, contractResolver).ConfigureAwait(false);
return schema;
}
}
}