Appends a JSON Schema to the Definitions of a Swagger document.
Наследование: JsonSchemaResolver
Пример #1
0
        /// <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);
        }
Пример #2
0
 private static Func <SwaggerDocument, JsonReferenceResolver> CreateReferenceResolverFactory()
 {
     return(document =>
     {
         var schemaResolver = new SwaggerSchemaResolver(document, new JsonSchemaGeneratorSettings());
         return new JsonAndYamlReferenceResolver(schemaResolver);
     });
 }
Пример #3
0
        /// <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);
        }
Пример #4
0
        /// <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));
        }
Пример #5
0
        /// <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));
        }