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); }
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); }