/// <summary> /// Follows a JsonPointer and returns the target schema. /// </summary> /// <remarks>Does not support relative JSON Pointers</remarks> /// <param name="schema">The root JSON Schema</param> /// <param name="path">The path to follow</param> /// <returns>The JSON Schema found by following the pointer</returns> public static JsonSchema FollowReference(this JsonSchema schema, JsonPointer path) { IRefResolvable schemaSegment = schema; foreach (var segment in path.Segments) { schemaSegment = schemaSegment.ResolvePointerSegment(segment.Value); if (schemaSegment == null) { return(null); } } return(schemaSegment as JsonSchema); }
internal (JsonSchema, Uri) FindSubschema(JsonPointer pointer, Uri currentUri) { IRefResolvable resolvable = this; for (var i = 0; i < pointer.Segments.Length; i++) { var segment = pointer.Segments[i]; var newResolvable = resolvable.ResolvePointerSegment(segment.Value); if (newResolvable == null) { // TODO: document that this process does not consider `$id` in extraneous data if (resolvable is JsonSchema subSchema && subSchema.OtherData != null && subSchema.OtherData.TryGetValue(segment.Value, out var element)) { var newPointer = JsonPointer.Create(pointer.Segments.Skip(i + 1), true); var value = newPointer.Evaluate(element); var asSchema = FromText(value.ToString()); return(asSchema, currentUri); } return(null, currentUri); } if (newResolvable is JsonSchema schema && schema.Keywords != null) { var idKeyword = schema.Keywords.OfType <IdKeyword>().SingleOrDefault(); if (idKeyword != null && i != pointer.Segments.Length - 1) { currentUri = idKeyword.UpdateUri(currentUri); } } resolvable = newResolvable; } if (!(resolvable is JsonSchema)) { resolvable = resolvable.ResolvePointerSegment(null); } return(resolvable as JsonSchema, currentUri); }