#pragma warning disable 1998 protected override async Task <IJsonReference> VisitJsonReferenceAsync(IJsonReference reference, string path, string typeNameHint) #pragma warning restore 1998 { if (reference.Reference != null) { if (!_removeExternalReferences || reference.Reference.DocumentPath == null) { _schemaReferences[reference] = reference.Reference.ActualObject; } else { var externalReference = reference.Reference; var externalReferenceRoot = externalReference.FindParentDocument(); reference.ReferencePath = externalReference.DocumentPath + JsonPathUtilities.GetJsonPath( externalReferenceRoot, externalReference, _contractResolver).TrimEnd('#'); } } else if (_removeExternalReferences && _rootObject != reference && reference.DocumentPath != null) { throw new NotSupportedException("removeExternalReferences not supported"); //return new JsonSchema4 { ReferencePath = reference.DocumentPath }; } return(reference); }
private static void UpdateSchemaReferencePaths(object obj, HashSet <object> checkedObjects, Dictionary <JsonSchema4, JsonSchema4> schemaReferences) { if (obj == null || obj is string) { return; } var schema = obj as JsonSchema4; if (schema != null && schema.SchemaReference != null) { if (schema.SchemaReference.DocumentPath == null) { schemaReferences[schema] = schema.SchemaReference.ActualSchema; } else { // TODO: Improve performance here (like the rest) var externalReference = schema.SchemaReference; var externalReferenceRoot = externalReference.FindRootParent(); schema.SchemaReferencePath = externalReference.DocumentPath + JsonPathUtilities.GetJsonPath(externalReferenceRoot, externalReference); } } if (obj is IDictionary) { foreach (var item in ((IDictionary)obj).Values.OfType <object>().ToList()) { UpdateSchemaReferencePaths(item, checkedObjects, schemaReferences); } } else if (obj is IEnumerable) { foreach (var item in ((IEnumerable)obj).OfType <object>().ToArray()) { UpdateSchemaReferencePaths(item, checkedObjects, schemaReferences); } } if (!(obj is JToken)) { foreach (var member in ReflectionCache.GetPropertiesAndFields(obj.GetType()).Where(p => p.CanRead && p.IsIndexer == false && p.MemberInfo is PropertyInfo && p.CustomAttributes.JsonIgnoreAttribute == null)) { var value = member.GetValue(obj); if (value != null) { if (!checkedObjects.Contains(value)) { checkedObjects.Add(value); UpdateSchemaReferencePaths(value, checkedObjects, schemaReferences); } } } } }
private static void UpdateSchemaReferencePaths(object root, object obj, HashSet <object> checkedObjects, ISchemaDefinitionAppender schemaDefinitionAppender) { if (obj == null || obj is string) { return; } var schema = obj as JsonSchema4; if (schema != null && schema.SchemaReference != null) { schema.SchemaReferencePath = JsonPathUtilities.GetJsonPath(root, schema.SchemaReference.ActualSchema, schemaDefinitionAppender); } if (obj is IDictionary) { foreach (var item in ((IDictionary)obj).Values.OfType <object>().ToList()) { UpdateSchemaReferencePaths(root, item, checkedObjects, schemaDefinitionAppender); } } else if (obj is IEnumerable) { foreach (var item in ((IEnumerable)obj).OfType <object>().ToArray()) { UpdateSchemaReferencePaths(root, item, checkedObjects, schemaDefinitionAppender); } } if (!(obj is JToken)) { foreach (var property in ReflectionCache.GetProperties(obj.GetType()).Where(p => p.CanRead && p.IsIndexer == false && p.MemberInfo is PropertyInfo && p.CustomAttributes.JsonIgnoreAttribute == null)) { var value = property.GetValue(obj); if (value != null) { if (!checkedObjects.Contains(value)) { checkedObjects.Add(value); UpdateSchemaReferencePaths(root, value, checkedObjects, schemaDefinitionAppender); } } } } }
private static void UpdateSchemaReferencePaths(object root, object obj, List <object> checkedObjects) { if (obj == null || obj is string) { return; } var schema = obj as JsonSchema4; if (schema != null && schema.SchemaReference != null) { schema.SchemaReferencePath = JsonPathUtilities.GetJsonPath(root, schema.SchemaReference); } if (obj is IDictionary) { foreach (var item in ((IDictionary)obj).Values) { UpdateSchemaReferencePaths(root, item, checkedObjects); } } else if (obj is IEnumerable) { foreach (var item in (IEnumerable)obj) { UpdateSchemaReferencePaths(root, item, checkedObjects); } } else { foreach (var property in obj.GetType().GetRuntimeProperties().Where(p => p.CanRead && p.GetCustomAttribute <JsonIgnoreAttribute>() == null)) { var value = property.GetValue(obj); if (value != null) { if (!checkedObjects.Contains(value)) { checkedObjects.Add(value); UpdateSchemaReferencePaths(root, value, checkedObjects); } } } } }