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);
                        }
                    }
                }
            }
        }
示例#2
0
 /// <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);
 }