JSON a C#
Genera records de C# con atributos JsonPropertyName a partir de una muestra JSON para System.Text.Json.
Entrada JSON
Código generado
Escribe JSON a la izquierda para generar un tipo a partir de él.
¿Qué es JSON a C#?
Un conversor de JSON a C# convierte una muestra de un payload JSON en declaraciones de records de C# listas para deserializar con System.Text.Json, el serializador integrado en el .NET moderno. Los records con propiedades de solo init son la forma idiomática actual de modelar una respuesta de API: el objeto es inmutable una vez construido, la igualdad por valor viene gratis y el serializador puede poblarlo directamente. La salida generada lleva además un atributo [JsonPropertyName] en cada propiedad, que es lo que hace fiable el mapeo — la convención de C# capitaliza los nombres de propiedad mientras que las claves JSON suelen ser camelCase o snake_case, y depender de la política de nombres del serializador para salvar ese hueco es una fuente frecuente de propiedades que se deserializan silenciosamente como null. Cada nombre de propiedad se convierte a PascalCase sin importar la capitalización de la clave de origen — camelCase, snake_case o kebab-case acaban todos en la misma forma PascalCase que el lenguaje espera — mientras que la clave original solo sobrevive en el atributo. Un número JSON con punto decimal se tipa como `double`, igual que System.Text.Json trata un número JSON sin tipar, en lugar de `float` o `decimal`.
Cómo usar JSON a C#
- Pega una respuesta JSON representativa en el panel izquierdo — las propiedades generadas coinciden exactamente con las claves presentes en esa muestra.
- Fija un nombre de record raíz sobre la salida (por defecto "Root"); cada objeto anidado se convierte en su propio record con el nombre de la clave que lo contiene.
- Copia los records a tu proyecto y deserializa con JsonSerializer.Deserialize<Root>(json).
- Usa el selector de lenguaje sobre la salida para emitir la misma forma como un record de Java o una data class de Kotlin.
Ejemplos
Objeto plano con atributos JsonPropertyName
Entrada
{"id": 1, "name": "Ada"}
Salida
using System.Text.Json.Serialization; public record Root { [JsonPropertyName("id")] public int Id { get; init; } [JsonPropertyName("name")] public string Name { get; init; } }
Un objeto anidado se convierte en su propio record
Entrada
{"user": {"id": 1, "roles": ["admin"]}}
Salida
using System.Text.Json.Serialization; using System.Collections.Generic; public record User { [JsonPropertyName("id")] public int Id { get; init; } [JsonPropertyName("roles")] public List<string> Roles { get; init; } } public record Root { [JsonPropertyName("user")] public User User { get; init; } }
Un valor decimal se convierte en double
Entrada
{"id": 1, "price": 9.99}
Salida
using System.Text.Json.Serialization; public record Root { [JsonPropertyName("id")] public int Id { get; init; } [JsonPropertyName("price")] public double Price { get; init; } }
Errores comunes
- Renombrar una propiedad de C# sin actualizar su [JsonPropertyName] — el serializador no encuentra entonces ninguna clave que coincida y deja la propiedad en su valor por defecto, sin excepción que señale la causa.
- Asumir que una política de nombres camelCase cubre todo el payload, lo que se rompe en cuanto una clave usa una convención distinta y produce nulls que parecen un problema de la API y no del mapeo.
- Dejar los nullable reference types activados en campos que la API puede omitir, lo que provoca avisos del compilador o un null en una propiedad que el sistema de tipos dice que no puede ser null.
- Dejar un campo monetario tipado como el double generado — cámbialo por decimal a mano cuando la precisión importe, ya que el generador no puede saber que un número representa dinero.
- Esperar que una clave snake_case o kebab-case sobreviva como nombre de propiedad de C# — cada propiedad se convierte a PascalCase por ti, y la clave original solo sobrevive dentro del atributo [JsonPropertyName].
Por qué usar esta herramienta
- Emite atributos [JsonPropertyName] explícitos, evitando los desajustes de política de nombres que anulan propiedades silenciosamente.
- Añade las directivas using necesarias, incluida System.Collections.Generic cuando el payload contiene arrays.
- Se ejecuta íntegramente en el cliente — una respuesta real de API pegada como muestra para generar records nunca llega a un servidor.
- Convierte cada nombre de propiedad a PascalCase automáticamente sin importar la capitalización de la clave de origen, conservando la clave original intacta vía [JsonPropertyName] para el serializador.
- Infiere int frente a double por valor desde la muestra, en lugar de asignar por defecto un único tipo numérico impreciso a todo número JSON.