# Jakarta JSON Binding (JSON-B) en Quarkus: Serialización Automática

## **Introducción**

Jakarta JSON Binding (JSON-B) proporciona una forma estándar de serializar y deserializar objetos Java a/desde JSON. En Quarkus, JSON-B está completamente integrado y funciona automáticamente en endpoints REST.

## **¿Qué es JSON-Binding?**

JSON-Binding permite convertir objetos Java a JSON y viceversa usando anotaciones declarativas. Quarkus lo usa automáticamente en endpoints REST, pero también puedes usarlo manualmente cuando necesites más control.

## **Serialización Automática en REST**

La forma más simple de usar JSON-B en Quarkus es simplemente retornar objetos Java en endpoints REST:

```go
@GET
@Path("/heroes")
public Response getAllHeroes() {
    List<Hero> heroes = heroService.findAll();
    return Response.ok(heroes).build(); // Se serializa automáticamente
}

@POST
@Path("/heroes")
public Response createHero(Hero hero) {
    // 'hero' ya está deserializado desde JSON automáticamente
    Hero created = heroService.create(hero);
    return Response.ok(created).build(); // Se serializa automáticamente
}
```

## **Anotaciones JSON-B**

### **@JsonbProperty**

Renombra campos en JSON:

```go
public class Team {
    @JsonbProperty("team_id")
    private Long id;
    
    @JsonbProperty("team_name")
    private String name;
}
```

### **@JsonbTransient**

Excluye campos de la serialización:

```go
public class Team {
    @JsonbTransient
    private String internalNotes; // No aparece en JSON
}
```

### **@JsonbDateFormat**

Formatea fechas:

```go
public class Team {
    @JsonbProperty("formation_date")
    @JsonbDateFormat("yyyy-MM-dd")
    private LocalDate formationDate;
}
```

### **@JsonbPropertyOrder**

Ordena campos en JSON:

```go
@JsonbPropertyOrder({"role", "hero_name", "power_level"})
public class TeamMember {
    @JsonbProperty("hero_name")
    private String heroName;
    
    @JsonbProperty("power_level")
    private Integer powerLevel;
}
```

## **Custom Adapters**

Los adapters permiten convertir tipos complejos:

```go
@JsonbTypeAdapter(PowerLevelAdapter.class)
private Integer powerLevel;

public class PowerLevelAdapter implements JsonbAdapter<Integer, PowerLevelDTO> {
    @Override
    public PowerLevelDTO adaptToJson(Integer powerLevel) {
        PowerLevelDTO dto = new PowerLevelDTO();
        dto.value = powerLevel;
        dto.category = categorizePowerLevel(powerLevel);
        dto.description = getPowerDescription(powerLevel);
        return dto;
    }
    
    @Override
    public Integer adaptFromJson(PowerLevelDTO dto) {
        return dto.value;
    }
}
```

## **Configuración Personalizada**

Puedes configurar Jsonb con opciones personalizadas:

```go
JsonbConfig config = new JsonbConfig()
    .withPropertyOrderStrategy(PropertyOrderStrategy.LEXICOGRAPHICAL)
    .withNullValues(true)
    .withFormatting(true);

Jsonb jsonb = JsonbBuilder.create(config);
String json = jsonb.toJson(team);
```

## **Serialización Manual**

Cuando necesitas control total:

```go
// Serializar
Jsonb jsonb = JsonbBuilder.create();
String json = jsonb.toJson(team);

// Deserializar
Team team = jsonb.fromJson(json, Team.class);
```

## **Objetos Anidados y Colecciones**

JSON-B maneja automáticamente objetos anidados y colecciones:

```go
public class Team {
    @JsonbProperty("members")
    private List<TeamMember> members;
    
    @JsonbProperty("headquarters")
    private Location headquarters;
}
```

## **Ejemplo Completo**

Nuestro demo muestra:

* Serialización/deserialización automática en REST
    
* Anotaciones @JsonbProperty, @JsonbTransient, @JsonbDateFormat
    
* Custom adapters para conversiones complejas
    
* Configuración personalizada de Jsonb
    
* Objetos anidados y colecciones
    

## **Ventajas en Quarkus**

1. **Automático**: Funciona sin configuración adicional
    
2. **Integrado**: Serialización automática en REST endpoints
    
3. **Flexible**: Anotaciones y adapters para casos complejos
    
4. **Performance**: Serialización eficiente
    

## **Conclusión**

JSON-Binding en Quarkus hace que trabajar con JSON sea extremadamente simple. La serialización automática elimina mucho código boilerplate, y las anotaciones proporcionan control cuando lo necesitas.

## **Recursos**

* [Demo completo](file:///Users/josediaz/Projects/JoeDayz/jakartaee-2026/quarkus-demos/json-binding/)
    
* [Quarkus REST JSON Guide](https://quarkus.io/guides/rest-json)
    
* [Jakarta JSON Binding Specification](https://jakarta.ee/specifications/jsonb/)
