JSON a clase C#

Pega un objeto JSON o una respuesta de API y obtén clases o records de modelo en C# con propiedades en PascalCase, los tipos numéricos y anulables correctos y atributos opcionales de System.Text.Json o Newtonsoft.Json. La conversión se hace por completo en tu navegador.

Última actualización:

Tu JSON se analiza localmente en esta pestaña y nunca se sube. Consejo: Ctrl + Intro genera el código.

Publicidad
Publicidad

Cómo usar JSON a clase C#

  1. Pega tu JSON en el cuadro de la izquierda o abre un archivo .json. Se carga un ejemplo para que veas el resultado al instante.
  2. Ponle nombre a la clase raíz y define un namespace, o déjalo vacío para omitirlo.
  3. Elige las opciones: class o record, biblioteca de atributos, tipo de colección, double o decimal, tipos de referencia anulables y detección de DateTime.
  4. Pulsa Generar clases C#. Con la actualización en vivo activada, el código se actualiza mientras escribes.
  5. Copia o descarga el archivo .cs y deserializa con JsonSerializer.Deserialize<Root>(json).

Ejemplo: de JSON a una clase C#

Para {"id": 7, "user_name": "ada", "price": 9.99, "tags": ["new"], "shippedAt": null}, las opciones predeterminadas (System.Text.Json, tipos de referencia anulables) generan:

public class Root
{
    [JsonPropertyName("id")]
    public int Id { get; set; }

    [JsonPropertyName("user_name")]
    public string UserName { get; set; } = string.Empty;

    [JsonPropertyName("price")]
    public double Price { get; set; }

    [JsonPropertyName("tags")]
    public List<string> Tags { get; set; } = new();

    [JsonPropertyName("shippedAt")]
    public object? ShippedAt { get; set; }
}

Deserialízalo con var root = JsonSerializer.Deserialize<Root>(json); (System.Text.Json) o JsonConvert.DeserializeObject<Root>(json) (Newtonsoft.Json).

Cómo se asignan los valores JSON a tipos de C#

Valor JSONTipo C#
"text"string (string? si puede ser null o faltar)
"2024-05-01T09:30:00Z"DateTime (con la detección de fechas activada)
42int; long por encima de 2,147,483,647
9.99double o decimal
truebool (bool? si puede ser null o faltar)
{ … }Una clase o record independiente
{}Dictionary<string, object?>
["a"]List<string>, string[] o IReadOnlyList<string>
[], valores mixtos, siempre nullobject / List<object>

Consejos para modelos C# limpios

  • Usa decimal para dinero. double no puede representar 0.1 con exactitud, así que los precios y saldos deberían ser decimal.
  • Coincidencia sin distinguir mayúsculas. Sin atributos, System.Text.Json distingue mayúsculas y minúsculas en los nombres de propiedad, salvo que definas PropertyNameCaseInsensitive = true o uses JsonSerializerDefaults.Web. Los atributos generados evitan ese problema por completo.
  • Prefiere DateTimeOffset para horas con zona. Si las marcas de tiempo llevan un desfase como +02:00 y necesitas conservarlo, cambia DateTime por DateTimeOffset.
  • Usa ejemplos reales. Pega un array con varios elementos para que el generador vea qué propiedades son opcionales o anulables.

Preguntas frecuentes

¿Atributos de System.Text.Json o de Newtonsoft.Json?

System.Text.Json viene integrado en .NET Core 3.0 y posteriores y es el predeterminado en ASP.NET Core, así que [JsonPropertyName("…")] es la opción habitual. Elige Newtonsoft.Json si tu proyecto ya usa Json.NET; obtendrás [JsonProperty("…")]. Los atributos asignan cada propiedad en PascalCase a la clave JSON exacta, así que la deserialización funciona con cualquier política de nombres.

¿Class o record?

Los records (C# 9 y posteriores) ofrecen igualdad basada en valores y expresiones with, y los descriptores de acceso init generados hacen que los objetos sean inmutables tras crearse, lo que encaja con DTO y respuestas de API. Las clases con get; set; son mutables y funcionan con cualquier versión de C# y cualquier serializador.

¿Cómo se asignan los tipos numéricos?

Los números enteros pasan a ser int, o long cuando algún valor está fuera del rango de 32 bits. Los números con punto decimal o exponente pasan a ser double, o decimal si lo eliges, que es mejor para dinero. Un campo que mezcla enteros y decimales usa el tipo decimal que hayas seleccionado.

¿Cómo se tratan los valores null y los que faltan?

Los tipos de valor que son null o faltan en algunos elementos pasan a ser anulables, como int? o bool?. Con los tipos de referencia anulables activados, los strings, listas y clases anulables llevan ?, y los no anulables se inicializan (string.Empty, new()) para que el compilador no avise. Por eso el archivo empieza con #nullable enable.

¿Cómo se crean los nombres de las propiedades?

Las claves se dividen en palabras por guiones bajos, guiones, espacios y cambios de camelCase, y se unen en PascalCase, así que avatar_url pasa a ser AvatarUrl y email-notifications pasa a ser EmailNotifications. Una clave que coincidiría con el nombre de la clase recibe el sufijo Value, porque C# no permite un miembro con el mismo nombre que su tipo.

¿En qué se convierte un array o un valor mixto?

Un array de objetos se convierte en una List de una clase combinada a partir de todos los elementos. Un array vacío se convierte en List<object>, y los valores que mezclan tipos (por ejemplo números y strings) se convierten en object, porque C# no tiene tipos unión.

¿Se sube mi JSON?

No. Todo ocurre en JavaScript dentro de esta página, así que tu JSON nunca sale de tu dispositivo.

¿Se prueban todas las herramientas de FreeToolCabin para comprobar su calidad y precisión?

Sí. Cada herramienta del sitio pasa pruebas automáticas en navegadores reales para comprobar que el resultado es correcto y que no hay errores. Si encuentras un fallo o tienes una sugerencia, escríbenos a [email protected] y lo revisaremos.

Herramientas relacionadas

Ver todas las de Conversores de datos y formatos de archivo →