private SwaggerParameter CreatePrimitiveParameter(SwaggerService service, string name, string description, Type type, IList <Attribute> parentAttributes, ISchemaResolver schemaResolver) { var schemaDefinitionAppender = new SwaggerServiceSchemaDefinitionAppender(service, Settings.TypeNameGenerator); var schemaGenerator = new RootTypeJsonSchemaGenerator(service, schemaDefinitionAppender, Settings); var typeDescription = JsonObjectTypeDescription.FromType(type, parentAttributes, Settings.DefaultEnumHandling); var parameterType = typeDescription.IsComplexType ? typeof(string) : type; // complex types must be treated as string var operationParameter = new SwaggerParameter(); typeDescription.ApplyType(operationParameter); if (parameterType.GetTypeInfo().IsEnum) { operationParameter.SchemaReference = schemaGenerator.Generate <JsonSchema4>(parameterType, null, parentAttributes, schemaDefinitionAppender, schemaResolver); } else { schemaGenerator.ApplyPropertyAnnotations(operationParameter, type, parentAttributes, typeDescription); } operationParameter.Name = name; operationParameter.IsRequired = parentAttributes?.Any(a => a.GetType().Name == "RequiredAttribute") ?? false; operationParameter.IsNullableRaw = typeDescription.IsNullable; if (description != string.Empty) { operationParameter.Description = description; } return(operationParameter); }
private TSchemaType CreateAndAddSchema <TSchemaType>(SwaggerService service, Type type, ISchemaResolver schemaResolver) where TSchemaType : JsonSchema4, new() { if (type.Name == "Task`1") { type = type.GenericTypeArguments[0]; } if (type.Name == "JsonResult`1") { type = type.GenericTypeArguments[0]; } if (type.Name == "IHttpActionResult" || type.Name == "HttpResponseMessage" || type.InheritsFrom("HttpResponseMessage")) { type = typeof(object); } var info = JsonObjectTypeDescription.FromType(type); if (info.Type.HasFlag(JsonObjectType.Object)) { if (type == typeof(object)) { return(new TSchemaType { Type = JsonObjectType.Object, AllowAdditionalProperties = false }); } if (!schemaResolver.HasSchema(type, false)) { var schemaGenerator = new RootTypeJsonSchemaGenerator(service, Settings); schemaGenerator.Generate <JsonSchema4>(type, schemaResolver); } return(new TSchemaType { Type = JsonObjectType.Object, SchemaReference = schemaResolver.GetSchema(type, false) }); } if (info.Type.HasFlag(JsonObjectType.Array)) { var itemType = type.GenericTypeArguments.Length == 0 ? type.GetElementType() : type.GenericTypeArguments[0]; return(new TSchemaType { Type = JsonObjectType.Array, Item = CreateAndAddSchema <JsonSchema4>(service, itemType, schemaResolver) }); } var generator = new RootTypeJsonSchemaGenerator(service, Settings); return(generator.Generate <TSchemaType>(type, schemaResolver)); }
private TSchemaType CreateAndAddSchema <TSchemaType>(Type type, ISchemaResolver schemaResolver) where TSchemaType : JsonSchema4, new() { if (type.Name == "Task`1") { type = type.GenericTypeArguments[0]; } if (type.Name == "JsonResult`1") { type = type.GenericTypeArguments[0]; } var info = JsonObjectTypeDescription.FromType(type); if (info.Type.HasFlag(JsonObjectType.Object)) { if (!schemaResolver.HasSchema(type)) { var schemaGenerator = new RootTypeJsonSchemaGenerator(_service); schemaGenerator.Generate <JsonSchema4>(type, schemaResolver); } //load //目前先屏蔽处理某些特定类型的异常 //Dictionary<string,string> JsonSchema4 t = null; try { t = schemaResolver.GetSchema(type); } catch (Exception) { } return(new TSchemaType { Type = JsonObjectType.Object, SchemaReference = t }); } if (info.Type.HasFlag(JsonObjectType.Array)) { var itemType = type.GenericTypeArguments.Length == 0 ? type.GetElementType() : type.GenericTypeArguments[0]; return(new TSchemaType { Type = JsonObjectType.Array, Item = CreateAndAddSchema <JsonSchema4>(itemType, schemaResolver) }); } var generator = new RootTypeJsonSchemaGenerator(_service); return(generator.Generate <TSchemaType>(type, schemaResolver)); }
private SwaggerParameter CreatePrimitiveParameter(SwaggerService service, ParameterInfo parameter, ISchemaResolver schemaResolver) { var parameterGenerator = new RootTypeJsonSchemaGenerator(service, Settings); var info = JsonObjectTypeDescription.FromType(parameter.ParameterType); var isComplexParameter = IsComplexType(info); var parameterType = isComplexParameter ? typeof(string) : parameter.ParameterType; // complex types must be treated as string var segmentParameter = parameterGenerator.Generate <SwaggerParameter>(parameterType, schemaResolver); segmentParameter.Name = parameter.Name; segmentParameter.Description = parameter.GetXmlDocumentation(); return(segmentParameter); }
private SwaggerParameter CreatePrimitiveParameter(SwaggerService service, string name, string description, Type type, IEnumerable <Attribute> parentAttributes, ISchemaResolver schemaResolver) { var parameterGenerator = new RootTypeJsonSchemaGenerator(service, Settings); var info = JsonObjectTypeDescription.FromType(type); var parameterType = info.IsComplexType ? typeof(string) : type; // complex types must be treated as string var operationParameter = parameterGenerator.Generate <SwaggerParameter>(parameterType, parentAttributes, schemaResolver); operationParameter.Name = name; if (description != string.Empty) { operationParameter.Description = description; } return(operationParameter); }
/// <exception cref="InvalidOperationException">The parameter cannot be an object or array. </exception> private SwaggerParameter CreatePrimitiveParameter(ParameterInfo parameter, ISchemaResolver schemaResolver) { var parameterType = parameter.ParameterType; //处理Guid if (parameterType == typeof(Guid)) { parameterType = typeof(string); } var info = JsonObjectTypeDescription.FromType(parameterType); if (info.Type.HasFlag(JsonObjectType.Object) || info.Type.HasFlag(JsonObjectType.Array)) { throw new InvalidOperationException("The parameter '" + parameter.Name + "' cannot be an object or array."); } var parameterGenerator = new RootTypeJsonSchemaGenerator(_service); var segmentParameter = parameterGenerator.Generate <SwaggerParameter>(parameter.ParameterType, schemaResolver); segmentParameter.Name = parameter.Name; return(segmentParameter); }
private JsonSchema4 CreateAndAddSchema(SwaggerService service, Type type, bool mayBeNull, IEnumerable <Attribute> parentAttributes, ISchemaResolver schemaResolver) { if (type.Name == "Task`1") { type = type.GenericTypeArguments[0]; } if (type.Name == "JsonResult`1") { type = type.GenericTypeArguments[0]; } if (IsFileResponse(type)) { return new JsonSchema4 { Type = JsonObjectType.File } } ; var schemaDefinitionAppender = new SwaggerServiceSchemaDefinitionAppender(service, Settings.TypeNameGenerator); var typeDescription = JsonObjectTypeDescription.FromType(type, parentAttributes, Settings.DefaultEnumHandling); if (typeDescription.Type.HasFlag(JsonObjectType.Object) && !typeDescription.IsDictionary) { if (type == typeof(object)) { return(new JsonSchema4 { // IsNullable is directly set on SwaggerParameter or SwaggerResponse Type = Settings.NullHandling == NullHandling.JsonSchema ? JsonObjectType.Object | JsonObjectType.Null : JsonObjectType.Object, AllowAdditionalProperties = false }); } if (!schemaResolver.HasSchema(type, false)) { var schemaGenerator = new RootTypeJsonSchemaGenerator(service, schemaDefinitionAppender, Settings); schemaGenerator.Generate(type, null, null, schemaDefinitionAppender, schemaResolver); } if (mayBeNull) { if (Settings.NullHandling == NullHandling.JsonSchema) { var schema = new JsonSchema4(); schema.OneOf.Add(new JsonSchema4 { Type = JsonObjectType.Null }); schema.OneOf.Add(new JsonSchema4 { SchemaReference = schemaResolver.GetSchema(type, false) }); return(schema); } else { // IsNullable is directly set on SwaggerParameter or SwaggerResponse return(new JsonSchema4 { SchemaReference = schemaResolver.GetSchema(type, false) }); } } else { return new JsonSchema4 { SchemaReference = schemaResolver.GetSchema(type, false) } }; } if (typeDescription.Type.HasFlag(JsonObjectType.Array)) { var itemType = type.GenericTypeArguments.Length == 0 ? type.GetElementType() : type.GenericTypeArguments[0]; return(new JsonSchema4 { // IsNullable is directly set on SwaggerParameter or SwaggerResponse Type = Settings.NullHandling == NullHandling.JsonSchema ? JsonObjectType.Array | JsonObjectType.Null : JsonObjectType.Array, Item = CreateAndAddSchema(service, itemType, false, null, schemaResolver) }); } var generator = new RootTypeJsonSchemaGenerator(service, schemaDefinitionAppender, Settings); return(generator.Generate(type, null, null, schemaDefinitionAppender, schemaResolver)); } } }
private JsonSchema4 CreateAndAddSchema(SwaggerService service, Type type, IEnumerable <Attribute> parentAttributes, ISchemaResolver schemaResolver) { if (type.Name == "Task`1") { type = type.GenericTypeArguments[0]; } if (type.Name == "JsonResult`1") { type = type.GenericTypeArguments[0]; } if (IsFileResponse(type)) { return new JsonSchema4 { Type = JsonObjectType.File } } ; var schemaDefinitionAppender = new SwaggerServiceSchemaDefinitionAppender(service); var typeDescription = JsonObjectTypeDescription.FromType(type, parentAttributes, Settings.DefaultEnumHandling); if (typeDescription.Type.HasFlag(JsonObjectType.Object) && !typeDescription.IsDictionary) { if (type == typeof(object)) { return(new JsonSchema4 { Type = JsonObjectType.Object | JsonObjectType.Null, AllowAdditionalProperties = false }); } if (!schemaResolver.HasSchema(type, false)) { var schemaGenerator = new RootTypeJsonSchemaGenerator(service, schemaDefinitionAppender, Settings); schemaGenerator.Generate(type, null, null, schemaDefinitionAppender, schemaResolver); } return(new JsonSchema4 { Type = JsonObjectType.Object | JsonObjectType.Null, SchemaReference = schemaResolver.GetSchema(type, false) }); } if (typeDescription.Type.HasFlag(JsonObjectType.Array)) { var itemType = type.GenericTypeArguments.Length == 0 ? type.GetElementType() : type.GenericTypeArguments[0]; return(new JsonSchema4 { Type = JsonObjectType.Array | JsonObjectType.Null, Item = CreateAndAddSchema(service, itemType, null, schemaResolver) }); } var generator = new RootTypeJsonSchemaGenerator(service, schemaDefinitionAppender, Settings); return(generator.Generate(type, null, null, schemaDefinitionAppender, schemaResolver)); } }