private void ReferenceOrWriteSchema(JsonSchema schema) { if (schema.Id != null && _resolver.GetSchema(schema.Id) != null) { _writer.WriteStartObject(); _writer.WritePropertyName(JsonTypeReflector.RefPropertyName); _writer.WriteValue(schema.Id); _writer.WriteEndObject(); } else { WriteSchema(schema); } }
private JsonSchema ResolveReferences(JsonSchema schema) { if (schema.DeferredReference != null) { var reference = schema.DeferredReference; var locationReference = reference.StartsWith("#", StringComparison.Ordinal); if (locationReference) { reference = UnescapeReference(reference); } var resolvedSchema = _resolver.GetSchema(reference); if (resolvedSchema == null) { if (locationReference) { var escapedParts = schema.DeferredReference.TrimStart('#').Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries); JToken currentToken = _rootSchema; foreach (var escapedPart in escapedParts) { var part = UnescapeReference(escapedPart); if (currentToken.Type == JTokenType.Object) { currentToken = currentToken[part]; } else if (currentToken.Type == JTokenType.Array || currentToken.Type == JTokenType.Constructor) { if (int.TryParse(part, out var index) && index >= 0 && index < currentToken.Count()) { currentToken = currentToken[index]; } else { currentToken = null; } } if (currentToken == null) { break; } } if (currentToken != null) { resolvedSchema = BuildSchema(currentToken); } } if (resolvedSchema == null) { throw new JsonException( "Could not resolve schema reference '{0}'.".FormatWith(CultureInfo.InvariantCulture, schema.DeferredReference)); } } schema = resolvedSchema; } if (schema.ReferencesResolved) { return(schema); } schema.ReferencesResolved = true; if (schema.Extends != null) { for (var i = 0; i < schema.Extends.Count; i++) { schema.Extends[i] = ResolveReferences(schema.Extends[i]); } } if (schema.Items != null) { for (var i = 0; i < schema.Items.Count; i++) { schema.Items[i] = ResolveReferences(schema.Items[i]); } } if (schema.AdditionalItems != null) { schema.AdditionalItems = ResolveReferences(schema.AdditionalItems); } if (schema.PatternProperties != null) { foreach (var patternProperty in schema.PatternProperties.ToList()) { schema.PatternProperties[patternProperty.Key] = ResolveReferences(patternProperty.Value); } } if (schema.Properties != null) { foreach (var property in schema.Properties.ToList()) { schema.Properties[property.Key] = ResolveReferences(property.Value); } } if (schema.AdditionalProperties != null) { schema.AdditionalProperties = ResolveReferences(schema.AdditionalProperties); } return(schema); }