コード例 #1
0
        /// <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);
        }
コード例 #2
0
        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);
        }