/// <summary>Creates a Swagger specification from a JSON string.</summary> /// <param name="data">The JSON data.</param> /// <param name="documentPath">The document path (URL or file path) for resolving relative document references.</param> /// <param name="expectedSchemaType">The expected schema type which is used when the type cannot be determined.</param> /// <returns>The <see cref="SwaggerDocument"/>.</returns> public static async Task <SwaggerDocument> FromJsonAsync(string data, string documentPath = null, SchemaType expectedSchemaType = SchemaType.Swagger2) { if (data.Contains(@"""swagger"": ""2")) { expectedSchemaType = SchemaType.Swagger2; } else if (data.Contains(@"""openapi"": ""3")) { expectedSchemaType = SchemaType.OpenApi3; } else if (expectedSchemaType == SchemaType.JsonSchema) { throw new NotSupportedException("The schema type JsonSchema is not supported."); } data = JsonSchemaReferenceUtilities.ConvertJsonReferences(data); var contractResolver = CreateJsonSerializerContractResolver(expectedSchemaType); var document = JsonConvert.DeserializeObject <SwaggerDocument>(data, new JsonSerializerSettings { MetadataPropertyHandling = MetadataPropertyHandling.Ignore, ConstructorHandling = ConstructorHandling.Default, ReferenceLoopHandling = ReferenceLoopHandling.Serialize, PreserveReferencesHandling = PreserveReferencesHandling.Objects, ContractResolver = contractResolver }); document.DocumentPath = documentPath; var schemaResolver = new SwaggerSchemaResolver(document, new JsonSchemaGeneratorSettings()); var referenceResolver = new JsonReferenceResolver(schemaResolver); await JsonSchemaReferenceUtilities.UpdateSchemaReferencesAsync(document, referenceResolver).ConfigureAwait(false); return(document); }
private static Func <SwaggerDocument, JsonReferenceResolver> CreateReferenceResolverFactory() { return(document => { var schemaResolver = new SwaggerSchemaResolver(document, new JsonSchemaGeneratorSettings()); return new JsonAndYamlReferenceResolver(schemaResolver); }); }
/// <summary>Creates a Swagger specification from a JSON string.</summary> /// <param name="data">The JSON data.</param> /// <param name="documentPath">The document path (URL or file path) for resolving relative document references.</param> /// <returns>The <see cref="SwaggerDocument"/>.</returns> public static async Task <SwaggerDocument> FromJsonAsync(string data, string documentPath = null) { data = JsonSchemaReferenceUtilities.ConvertJsonReferences(data); var document = JsonConvert.DeserializeObject <SwaggerDocument>(data, new JsonSerializerSettings { ConstructorHandling = ConstructorHandling.Default, ReferenceLoopHandling = ReferenceLoopHandling.Serialize, PreserveReferencesHandling = PreserveReferencesHandling.Objects }); document.DocumentPath = documentPath; var schemaResolver = new SwaggerSchemaResolver(document, new JsonSchemaGeneratorSettings()); var referenceResolver = new JsonReferenceResolver(schemaResolver); await JsonSchemaReferenceUtilities.UpdateSchemaReferencesAsync(document, referenceResolver).ConfigureAwait(false); return(document); }
/// <summary>Creates a Swagger specification from a JSON string.</summary> /// <param name="data">The JSON data.</param> /// <param name="documentPath">The document path (URL or file path) for resolving relative document references.</param> /// <param name="expectedSchemaType">The expected schema type which is used when the type cannot be determined.</param> /// <param name="referenceResolverFactory">The JSON reference resolver factory.</param> /// <returns>The <see cref="SwaggerDocument"/>.</returns> public static async Task <SwaggerDocument> FromJsonAsync(string data, string documentPath, SchemaType expectedSchemaType, Func <SwaggerDocument, JsonReferenceResolver> referenceResolverFactory) { // For explanation of the regex use https://regexr.com/ and the below unescaped pattern that is without named groups // (?:\"(openapi|swagger)\")(?:\s*:\s*)(?:\"([^"]*)\") var pattern = "(?:\\\"(?<schemaType>openapi|swagger)\\\")(?:\\s*:\\s*)(?:\\\"(?<schemaVersion>[^\"]*)\\\")"; var match = Regex.Match(data, pattern, RegexOptions.IgnoreCase); if (match.Success) { var schemaType = match.Groups["schemaType"].Value.ToLower(); var schemaVersion = match.Groups["schemaVersion"].Value.ToLower(); if (schemaType == "swagger" && schemaVersion.StartsWith("2")) { expectedSchemaType = SchemaType.Swagger2; } else if (schemaType == "openapi" && schemaVersion.StartsWith("3")) { expectedSchemaType = SchemaType.OpenApi3; } } if (expectedSchemaType == SchemaType.JsonSchema) { throw new NotSupportedException("The schema type JsonSchema is not supported."); } var contractResolver = CreateJsonSerializerContractResolver(expectedSchemaType); return(await JsonSchemaSerialization.FromJsonAsync <SwaggerDocument>(data, expectedSchemaType, documentPath, document => { document.SchemaType = expectedSchemaType; if (referenceResolverFactory != null) { return referenceResolverFactory(document); } else { var schemaResolver = new SwaggerSchemaResolver(document, new JsonSchemaGeneratorSettings()); return new JsonReferenceResolver(schemaResolver); } }, contractResolver).ConfigureAwait(false)); }
/// <summary>Creates a Swagger specification from a JSON string.</summary> /// <param name="data">The JSON data.</param> /// <param name="documentPath">The document path (URL or file path) for resolving relative document references.</param> /// <param name="expectedSchemaType">The expected schema type which is used when the type cannot be determined.</param> /// <returns>The <see cref="SwaggerDocument"/>.</returns> public static async Task <SwaggerDocument> FromJsonAsync(string data, string documentPath = null, SchemaType expectedSchemaType = SchemaType.Swagger2) { if (data.Contains(@"""swagger"": ""2")) { expectedSchemaType = SchemaType.Swagger2; } else if (data.Contains(@"""openapi"": ""3")) { expectedSchemaType = SchemaType.OpenApi3; } else if (expectedSchemaType == SchemaType.JsonSchema) { throw new NotSupportedException("The schema type JsonSchema is not supported."); } var contractResolver = CreateJsonSerializerContractResolver(expectedSchemaType); return(await JsonSchemaSerialization.FromJsonAsync <SwaggerDocument>(data, expectedSchemaType, documentPath, document => { var schemaResolver = new SwaggerSchemaResolver(document, new JsonSchemaGeneratorSettings()); return new JsonReferenceResolver(schemaResolver); }, contractResolver).ConfigureAwait(false)); }