From 4d1b0a9283e5f5d4c61394930326a7010568ea98 Mon Sep 17 00:00:00 2001 From: Ruikai Huang Date: Mon, 12 Aug 2024 20:03:43 -0400 Subject: [PATCH] Fixed JSON reference resolution with escaped chars ~0 and ~1 --- src/NJsonSchema/JsonReferenceResolver.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/NJsonSchema/JsonReferenceResolver.cs b/src/NJsonSchema/JsonReferenceResolver.cs index b149fb9ea..40945342f 100644 --- a/src/NJsonSchema/JsonReferenceResolver.cs +++ b/src/NJsonSchema/JsonReferenceResolver.cs @@ -84,6 +84,11 @@ public async Task ResolveReferenceWithoutAppendAsync(object root return await ResolveReferenceAsync(rootObject, jsonPath, targetType, contractResolver, false, cancellationToken).ConfigureAwait(false); } + private static string UnescapeReferenceSegment(string segment) + { + return segment.Replace("~1", "/").Replace("~0", "~"); + } + /// Resolves a document reference. /// The root object. /// The JSON path to resolve. @@ -94,6 +99,11 @@ public async Task ResolveReferenceWithoutAppendAsync(object root public virtual IJsonReference ResolveDocumentReference(object rootObject, string jsonPath, Type targetType, IContractResolver contractResolver) { var allSegments = jsonPath.Split('/').Skip(1).ToList(); + for (int i = 0; i < allSegments.Count; i++) + { + allSegments[i] = UnescapeReferenceSegment(allSegments[i]); + } + var schema = ResolveDocumentReference(rootObject, allSegments, targetType, contractResolver, new HashSet()); if (schema == null) {