diff --git a/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiSchema.cs b/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiSchema.cs index 6cf093499..dd9188e67 100644 --- a/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiSchema.cs +++ b/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiSchema.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Text.Json.Nodes; using Microsoft.OpenApi.Interfaces; @@ -19,7 +20,7 @@ public interface IOpenApiSchema : IOpenApiDescribedElement, IOpenApiSerializable /// /// $schema, a JSON Schema dialect identifier. Value must be a URI /// - public string Schema { get; } + public Uri Schema { get; } /// /// $id - Identifies a schema resource with its canonical URI. diff --git a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs index 9c8a9b2a7..997dd2a0d 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs @@ -46,7 +46,7 @@ public void RegisterComponents() /// /// The default value for the $schema keyword within Schema Objects contained within this OAS document. This MUST be in the form of a URI. /// - public string? JsonSchemaDialect { get; set; } + public Uri? JsonSchemaDialect { get; set; } /// /// An array of Server Objects, which provide connectivity information to a target server. @@ -161,7 +161,7 @@ public void SerializeAsV31(IOpenApiWriter writer) writer.WriteProperty(OpenApiConstants.OpenApi, "3.1.1"); // jsonSchemaDialect - writer.WriteProperty(OpenApiConstants.JsonSchemaDialect, JsonSchemaDialect); + writer.WriteProperty(OpenApiConstants.JsonSchemaDialect, JsonSchemaDialect?.ToString()); SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (w, element) => element.SerializeAsV31(w)); diff --git a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs index e524cfe41..ee5b0d3c6 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs @@ -24,7 +24,7 @@ public class OpenApiSchema : IOpenApiReferenceable, IOpenApiExtensible, IOpenApi public string Title { get; set; } /// - public string Schema { get; set; } + public Uri Schema { get; set; } /// public string Id { get; set; } @@ -400,7 +400,7 @@ public void SerializeAsV2(IOpenApiWriter writer) internal void WriteJsonSchemaKeywords(IOpenApiWriter writer) { writer.WriteProperty(OpenApiConstants.Id, Id); - writer.WriteProperty(OpenApiConstants.DollarSchema, Schema); + writer.WriteProperty(OpenApiConstants.DollarSchema, Schema?.ToString()); writer.WriteProperty(OpenApiConstants.Comment, Comment); writer.WriteProperty(OpenApiConstants.Const, Const); writer.WriteOptionalMap(OpenApiConstants.Vocabulary, Vocabulary, (w, s) => w.WriteValue(s)); diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs index 746af1d80..9cac25d82 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs @@ -52,7 +52,7 @@ public string Description /// public string Title { get => Target?.Title; } /// - public string Schema { get => Target?.Schema; } + public Uri Schema { get => Target?.Schema; } /// public string Id { get => Target?.Id; } /// diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiDocumentDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiDocumentDeserializer.cs index f16ac31cc..bbbdad0d4 100644 --- a/src/Microsoft.OpenApi/Reader/V31/OpenApiDocumentDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiDocumentDeserializer.cs @@ -20,7 +20,7 @@ internal static partial class OpenApiV31Deserializer } /* Version is valid field but we already parsed it */ }, {"info", (o, n, _) => o.Info = LoadInfo(n, o)}, - {"jsonSchemaDialect", (o, n, _) => o.JsonSchemaDialect = n.GetScalarValue() }, + {"jsonSchemaDialect", (o, n, _) => { if (n.GetScalarValue() is string {} sjsd && Uri.TryCreate(sjsd, UriKind.Absolute, out var jsd)) {o.JsonSchemaDialect = jsd;}} }, {"servers", (o, n, _) => o.Servers = n.CreateList(LoadServer, o)}, {"paths", (o, n, _) => o.Paths = LoadPaths(n, o)}, {"webhooks", (o, n, _) => o.Webhooks = n.CreateMap(LoadPathItem, o)}, diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiSchemaDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiSchemaDeserializer.cs index 02039cebd..b31714f82 100644 --- a/src/Microsoft.OpenApi/Reader/V31/OpenApiSchemaDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiSchemaDeserializer.cs @@ -23,7 +23,7 @@ internal static partial class OpenApiV31Deserializer }, { "$schema", - (o, n, _) => o.Schema = n.GetScalarValue() + (o, n, _) => { if (n.GetScalarValue() is string {} sSchema && Uri.TryCreate(sSchema, UriKind.Absolute, out var schema)) {o.Schema = schema;}} }, { "$id", diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs index f1dc5640c..3f08158d4 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs @@ -405,7 +405,7 @@ public async Task ParseDocumentsWithReusablePathItemInWebhooksSucceeds() Title = "Webhook Example", Version = "1.0.0" }, - JsonSchemaDialect = "http://json-schema.org/draft-07/schema#", + JsonSchemaDialect = new Uri("http://json-schema.org/draft-07/schema#"), Webhooks = new Dictionary { ["pets"] = components.PathItems["pets"] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs index d96a1fe87..72e8bfbda 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs @@ -38,7 +38,7 @@ public async Task ParseBasicV31SchemaShouldSucceed() var expectedObject = new OpenApiSchema() { Id = "https://example.com/arrays.schema.json", - Schema = "https://json-schema.org/draft/2020-12/schema", + Schema = new Uri("https://json-schema.org/draft/2020-12/schema"), Description = "A representation of a person, company, organization, or place", Type = JsonSchemaType.Object, Properties = new Dictionary @@ -124,7 +124,7 @@ public void ParseSchemaWithTypeArrayWorks() var expected = new OpenApiSchema() { Id = "https://example.com/arrays.schema.json", - Schema = "https://json-schema.org/draft/2020-12/schema", + Schema = new Uri("https://json-schema.org/draft/2020-12/schema"), Description = "A representation of a person, company, organization, or place", Type = JsonSchemaType.Object | JsonSchemaType.Null }; diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs index 39ca7b8ab..6c27b87ab 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs @@ -1953,7 +1953,7 @@ public async Task SerializeDocumentWithRootJsonSchemaDialectPropertyWorks() Title = "JsonSchemaDialectTest", Version = "1.0.0" }, - JsonSchemaDialect = "http://json-schema.org/draft-07/schema#" + JsonSchemaDialect = new Uri("http://json-schema.org/draft-07/schema#") }; var expected = @"openapi: '3.1.1' diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index 76697d7ae..31eca28f1 100644 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -451,7 +451,7 @@ namespace Microsoft.OpenApi.Models.Interfaces System.Collections.Generic.IDictionary Properties { get; } bool ReadOnly { get; } System.Collections.Generic.ISet Required { get; } - string Schema { get; } + System.Uri Schema { get; } string Title { get; } Microsoft.OpenApi.Models.JsonSchemaType? Type { get; } bool UnEvaluatedProperties { get; } @@ -718,7 +718,7 @@ namespace Microsoft.OpenApi.Models public System.Collections.Generic.IDictionary? Extensions { get; set; } public Microsoft.OpenApi.Models.OpenApiExternalDocs? ExternalDocs { get; set; } public Microsoft.OpenApi.Models.OpenApiInfo Info { get; set; } - public string? JsonSchemaDialect { get; set; } + public System.Uri? JsonSchemaDialect { get; set; } public Microsoft.OpenApi.Models.OpenApiPaths Paths { get; set; } public System.Collections.Generic.IList? SecurityRequirements { get; set; } public System.Collections.Generic.IList? Servers { get; set; } @@ -1056,7 +1056,7 @@ namespace Microsoft.OpenApi.Models public System.Collections.Generic.IDictionary Properties { get; set; } public bool ReadOnly { get; set; } public System.Collections.Generic.ISet Required { get; set; } - public string Schema { get; set; } + public System.Uri Schema { get; set; } public string Title { get; set; } public Microsoft.OpenApi.Models.JsonSchemaType? Type { get; set; } public bool UnEvaluatedProperties { get; set; } @@ -1409,7 +1409,7 @@ namespace Microsoft.OpenApi.Models.References public System.Collections.Generic.IDictionary Properties { get; } public bool ReadOnly { get; } public System.Collections.Generic.ISet Required { get; } - public string Schema { get; } + public System.Uri Schema { get; } public string Title { get; } public Microsoft.OpenApi.Models.JsonSchemaType? Type { get; } public bool UnEvaluatedProperties { get; }