Skip to content
jsonforge.app

JSON a C#

Genera records de C# con atributos JsonPropertyName a partir de una muestra JSON para System.Text.Json.

Entrada JSON

Loading editor…

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#

  1. Pega una respuesta JSON representativa en el panel izquierdo — las propiedades generadas coinciden exactamente con las claves presentes en esa muestra.
  2. 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.
  3. Copia los records a tu proyecto y deserializa con JsonSerializer.Deserialize<Root>(json).
  4. 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.

Preguntas frecuentes