static IEnumerable <JsonSchemaItem> GetProperties(Type t, PropertyExportFlags exportFlags) { // fields foreach (var fi in t.GetFields()) { var a = fi.GetCustomAttributes(typeof(JsonSchemaAttribute), true).FirstOrDefault() as JsonSchemaAttribute; if (a == null) { a = fi.FieldType.GetCustomAttributes(typeof(JsonSchemaAttribute), true).FirstOrDefault() as JsonSchemaAttribute; if (a == null) { // default if (!fi.IsStatic && fi.IsPublic) { // only public instance field a = new JsonSchemaAttribute(); } } } // for array item var ia = fi.GetCustomAttributes(typeof(ItemJsonSchemaAttribute), true).FirstOrDefault() as ItemJsonSchemaAttribute; if (a == null) { //int x = 0; } else { yield return(new JsonSchemaItem { Key = fi.Name, Schema = JsonSchema.FromType(fi.FieldType, a, ia), Required = a.Required, Dependencies = a.Dependencies, }); } } // properties foreach (var pi in t.GetProperties()) { var a = pi.GetCustomAttributes(typeof(JsonSchemaAttribute), true).FirstOrDefault() as JsonSchemaAttribute; // for array item var ia = pi.GetCustomAttributes(typeof(ItemJsonSchemaAttribute), true).FirstOrDefault() as ItemJsonSchemaAttribute; if (a != null) { yield return(new JsonSchemaItem { Key = pi.Name, Schema = JsonSchema.FromType(pi.PropertyType, a, ia), Required = a.Required, Dependencies = a.Dependencies, }); } } }
public static JsonSchema FromType(Type t, JsonSchemaAttribute a = null, // field attribute ItemJsonSchemaAttribute ia = null ) { if (a == null) { // get class attribute a = t.GetCustomAttributes(typeof(JsonSchemaAttribute), true) .FirstOrDefault() as JsonSchemaAttribute; } if (a == null) { a = new JsonSchemaAttribute(); } if (ia == null) { ia = t.GetCustomAttributes(typeof(ItemJsonSchemaAttribute), true) .FirstOrDefault() as ItemJsonSchemaAttribute; } IJsonSchemaValidator validator = null; bool skipComparison = a.SkipSchemaComparison; if (t == typeof(object)) { skipComparison = true; } if (a.EnumValues != null) { validator = JsonEnumValidator.Create(a.EnumValues); } else if (t.IsEnum) { validator = JsonEnumValidator.Create(t, a.EnumSerializationType, a.EnumExcludes); } else { validator = JsonSchemaValidatorFactory.Create(t, a, ia); } var schema = new JsonSchema { Title = a.Title, Description = a.Description, Validator = validator, SkipComparison = skipComparison }; return(schema); }
public static JsonSchema FromType(Type t, BaseJsonSchemaAttribute a = null, // field attribute ItemJsonSchemaAttribute ia = null ) { // class attribute var aa = t.GetCustomAttributes(typeof(JsonSchemaAttribute), true) .FirstOrDefault() as JsonSchemaAttribute; if (a != null) { a.Merge(aa); } else { if (aa == null) { a = new JsonSchemaAttribute(); } else { a = aa; } } if (ia == null) { ia = t.GetCustomAttributes(typeof(ItemJsonSchemaAttribute), true) .FirstOrDefault() as ItemJsonSchemaAttribute; } IJsonSchemaValidator validator = null; bool skipComparison = a.SkipSchemaComparison; if (t == typeof(object)) { skipComparison = true; } if (a.EnumValues != null) { try { validator = JsonEnumValidator.Create(a.EnumValues, a.EnumSerializationType); } catch (Exception) { throw new Exception(String.Join(", ", a.EnumValues.Select(x => x.ToString()).ToArray())); } } else if (t.IsEnum) { validator = JsonEnumValidator.Create(t, a.EnumSerializationType, a.EnumExcludes); } else { validator = JsonSchemaValidatorFactory.Create(t, a, ia); } var schema = new JsonSchema { Title = a.Title, Description = a.Description, Validator = validator, SkipComparison = skipComparison, ExplicitIgnorableValue = a.ExplicitIgnorableValue, ExplicitIgnorableItemLength = a.ExplicitIgnorableItemLength, }; return(schema); }