c# - example - JsonSchemaGenerator no configura los campos obligatorios=falso
remarks c# (1)
La enumeración Required
controla qué valores puede tener la propiedad: si los valores nulos están permitidos o no. Para controlar la propiedad "required"
en el esquema json, lo que significa que la cadena json debe contener la propiedad real o no, debe usar las enumeraciones DefaultValueHandling
o DefaultValueHandling
al generar el esquema. Digamos que tenemos la siguiente clase:
public class Person
{
[JsonProperty(Required = Required.Default)]
public string FirstName { get; set; }
}
El esquema generado con JSON.NET para esta clase se ve así:
{
"id": "MyApp.Models.Person",
"type": "object",
"properties": {
"FirstName": {
"required": true,
"type": [
"string",
"null"
]
}
}
}
Este esquema indica que una cadena json debe tener la propiedad FirstName
y está permitido que esta propiedad tenga valores nulos.
Al cambiar el atributo Required
de Default
a Always
obtendremos el siguiente esquema:
{
"id": "MyApp.Models.Person",
"type": "object",
"properties": {
"FirstName": {
"required": true,
"type": "string"
}
}
}
Este esquema indica que una cadena json debe tener la propiedad FirstName
y NO está permitido que esta propiedad tenga valores nulos.
Para obtener lo que desea, deberá incluir las enumeraciones DefaultValueHandling
o DefaultValueHandling
. Algo como esto:
public class Person
{
[JsonProperty(Required = Required.Default, DefaultValueHandling = DefaultValueHandling.Ignore)]
public string FirstName { get; set; }
}
El esquema generado de esta clase se vería así:
{
"id": "MyApp.Models.Person",
"type": "object",
"properties": {
"FirstName": {
"type": [
"string",
"null"
]
}
}
}
Este esquema indica que la propiedad FirstName
no es necesaria en la cadena json, pero si está presente, puede tener un valor nulo. Se puede lograr el mismo efecto si usa DefaultValueHandling.IgnoreAndPopulate
enum value o si cambia a la propiedad DefaultValueHandling
lugar de la propiedad DefaultValueHandling
y establece su valor a NullValueHandling.Ignore
.
Estoy usando un JsonSchemaGenerator
de JSON.NET
en una serie de modelos para generar los respectivos esquemas JSON en un diccionario como el de abajo.
JsonSchemaGenerator generator = new JsonSchemaGenerator()
{
UndefinedSchemaIdHandling = UndefinedSchemaIdHandling.UseTypeName,
};
List<Type> modelTypes = Assembly.GetExecutingAssembly()
.GetTypes()
.ToList()
.Where(t => t.Namespace == "MyApp.Models")
.ToList();
foreach (Type type in modelTypes)
{
JsonSchema schema = generator.Generate(type, jsonSchemaResolver, false);
schemaDictionary.Add(type, schema);
}
Esto funciona correctamente con la excepción de los valores configurados para el atributo required
. No importa cómo decore las propiedades del modelo, los campos siempre se muestran como "required":true
como se muestra a continuación:
"FirstName": {
"required": true,
"type": "string"
}
Sin embargo, en el código mi modelo está decorado como tal:
[JsonProperty(Required = Required.Default)]
public string FirstName { get; set; }
En cuanto a la documentación de Json.Net, establecer en Required.Default
debería dar como resultado que la propiedad no se requiera en el esquema:
"Predeterminado - 0 - La propiedad no es obligatoria. El estado predeterminado".
Cualquier idea sobre lo que estoy haciendo incorrectamente y necesito cambiar para que la propiedad FirstName
se muestre en el esquema como "required": false
¿ "required": false
? No quiero tener que generar y darle masajes a todos estos esquemas.