private static void UpdateSchemaReferencePaths(object rootObject, object obj, HashSet <object> checkedObjects, JsonSchemaResolver schemaResolver) { if (obj == null || obj is string) { return; } var schema = obj as JsonSchema4; if (schema != null && schema.SchemaReference != null) { schema.SchemaReferencePath = JsonPathUtilities.GetJsonPath(rootObject, schema.SchemaReference.ActualSchema, schemaResolver); } if (obj is IDictionary) { foreach (var item in ((IDictionary)obj).Values.OfType <object>().ToList()) { UpdateSchemaReferencePaths(rootObject, item, checkedObjects, schemaResolver); } } else if (obj is IEnumerable) { foreach (var item in ((IEnumerable)obj).OfType <object>().ToArray()) { UpdateSchemaReferencePaths(rootObject, item, checkedObjects, schemaResolver); } } 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(rootObject, value, checkedObjects, schemaResolver); } } } } }
/// <summary>Initializes a new instance of the <see cref="JsonReferenceResolver"/> class.</summary> /// <param name="schemaResolver">The schema resolver.</param> public JsonReferenceResolver(JsonSchemaResolver schemaResolver) { _schemaResolver = schemaResolver; }
/// <summary>Updates the <see cref="JsonSchema4.SchemaReferencePath" /> properties /// from the available <see cref="JsonSchema4.SchemaReference" /> properties.</summary> /// <param name="rootObject">The root object.</param> /// <param name="schemaResolver">The schema resolver.</param> public static void UpdateSchemaReferencePaths(object rootObject, JsonSchemaResolver schemaResolver) { UpdateSchemaReferencePaths(rootObject, rootObject, new HashSet <object>(), schemaResolver); }