protected override async Task <IJsonReference> VisitJsonReferenceAsync(IJsonReference reference, string path, string typeNameHint, CancellationToken cancellationToken)
            {
                cancellationToken.ThrowIfCancellationRequested();
                if (reference.ReferencePath != null && reference.Reference == null)
                {
                    if (_replaceRefsRound)
                    {
                        if (path.EndsWith("/definitions/" + typeNameHint) || path.EndsWith("/schemas/" + typeNameHint))
                        {
                            // inline $refs in "definitions"
                            return(await _referenceResolver
                                   .ResolveReferenceWithoutAppendAsync(_rootObject, reference.ReferencePath, reference.GetType(), _contractResolver)
                                   .ConfigureAwait(false));
                        }
                    }
                    else
                    {
                        // load $refs and add them to "definitions"
                        reference.Reference = await _referenceResolver
                                              .ResolveReferenceAsync(_rootObject, reference.ReferencePath, reference.GetType(), _contractResolver)
                                              .ConfigureAwait(false);
                    }
                }

                return(reference);
            }
Esempio n. 2
0
            protected override async Task <IJsonReference> VisitJsonReferenceAsync(IJsonReference reference, string path, string typeNameHint)
            {
                if (reference.ReferencePath != null && reference.Reference == null)
                {
                    if (_replaceRefsRound)
                    {
                        if (path.EndsWith("/definitions/" + typeNameHint))
                        {
                            // inline $refs in "definitions"
                            return(await _referenceResolver
                                   .ResolveReferenceWithoutAppendAsync(_rootObject, reference.ReferencePath)
                                   .ConfigureAwait(false));
                        }
                    }
                    else
                    {
                        // load $refs and add them to "definitions"
                        reference.Reference = await _referenceResolver
                                              .ResolveReferenceAsync(_rootObject, reference.ReferencePath)
                                              .ConfigureAwait(false);
                    }
                }

                return(reference);
            }
        private static async Task UpdateSchemaReferencesAsync(object rootObject, object obj, HashSet <object> checkedObjects, JsonReferenceResolver jsonReferenceResolver)
        {
            if (obj == null || obj is string)
            {
                return;
            }

            var schema = obj as JsonSchema4;

            if (schema != null && schema.SchemaReferencePath != null)
            {
                schema.SchemaReference = await jsonReferenceResolver.ResolveReferenceAsync(rootObject, schema.SchemaReferencePath).ConfigureAwait(false);
            }

            if (obj is IDictionary)
            {
                foreach (var item in ((IDictionary)obj).Values.OfType <object>().ToArray())
                {
                    await UpdateSchemaReferencesAsync(rootObject, item, checkedObjects, jsonReferenceResolver).ConfigureAwait(false);
                }
            }
            else if (obj is IEnumerable)
            {
                foreach (var item in ((IEnumerable)obj).OfType <object>().ToArray())
                {
                    await UpdateSchemaReferencesAsync(rootObject, item, checkedObjects, jsonReferenceResolver).ConfigureAwait(false);
                }
            }

            if (!(obj is JToken))
            {
                foreach (var property in ReflectionCache.GetPropertiesAndFields(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);
                            await UpdateSchemaReferencesAsync(rootObject, value, checkedObjects, jsonReferenceResolver).ConfigureAwait(false);
                        }
                    }
                }
            }
        }