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; }