Example #1
0
        public SimpleJsonSchema GenerateSchemaObject()
        {
            var schema = Schema();

            schema.Add("$schema", "http://json-schema.org/draft-04/schema#");
            schema.Add("title", "root");
            schema.Add("id", "#root");

            var properties = Schema();

            schema.Add("properties", properties);

            foreach (var type in Types.OrderBy(each => each.Name))
            {
                AddToSchema(properties, type);
            }

            foreach (var latebound in LateBoundTypes)
            {
                AddToSchema(properties, latebound);
            }

            LateBoundTypes.Clear();

            return(schema);
        }
Example #2
0
        public SimpleJsonSchema GenerateSchema(Type type)
        {
            var typeSchema = Schema();

            if (type.IsEnum)
            {
                typeSchema.Add("type", "enum");

                var options = Schema();

                foreach (var value in Enum.GetValues(type))
                {
                    options.Add(Enum.GetName(type, value), value);
                }

                typeSchema.Add("options", options);
            }
            else
            {
                typeSchema.Add("type", "object");

                var typeProperties = Schema();
                typeSchema.Add("properties", typeProperties);

                foreach (var property in type.GetProperties())
                {
                    var typeProperty = Schema();

                    if (property.Is <string>())
                    {
                        typeProperty.Add("type", "string");
                    }
                    else if (property.Is <Guid>())
                    {
                        typeProperty.Add("type", "id");
                    }
                    else if (property.Is <bool>())
                    {
                        typeProperty.Add("type", "boolean");
                    }
                    else if (property.Is <DateTime>())
                    {
                        typeProperty.Add("type", "date");
                    }
                    else if (property.Is <int>() || property.Is <decimal>() || property.Is <double>() || property.Is <float>() || property.Is <long>())
                    {
                        typeProperty.Add("type", "number");
                    }
                    else if (property.PropertyType.IsGenericType && GetEnumerableType(property.PropertyType) != null)
                    {
                        //continue;
                        typeProperty.Add("type", "array");

                        var items = Schema();
                        items.Add("$ref", GetEnumerableType(property.PropertyType).Name);
                        typeProperty.Add("items", items);
                    }
                    else
                    {
                        if (property.PropertyType.IsEnum)
                        {
                            typeProperty.Add("type", "enum");

                            if (!LateBoundTypes.Contains(property.PropertyType))
                            {
                                LateBoundTypes.Add(property.PropertyType);
                            }
                        }

                        if (property.PropertyType.IsClass)
                        {
                            continue;
                            typeProperty.Add("type", "object");
                        }

                        typeProperty.Add("$ref", property.PropertyType.Name);
                    }

                    typeProperty.Add("set", property.GetSetMethod() != null ? "true" : "false");

                    var propertyName = property.Name.CamelCase();

                    if (!typeProperties.ContainsKey(propertyName))
                    {
                        typeProperties.Add(property.Name.CamelCase(), typeProperty);
                    }
                }

                if (IncludeMethods)
                {
                    var methods = type.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance).ToList();
                    typeSchema.Add("methods", MapSchema(methods));
                }
            }

            return(typeSchema);
        }