remarks example cref c# json json.net jsonschema

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.