コード例 #1
0
#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);
            }
コード例 #2
0
        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);
                        }
                    }
                }
            }
        }
コード例 #3
0
        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);
                        }
                    }
                }
            }
        }
コード例 #4
0
        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);
                        }
                    }
                }
            }
        }