Apex Academy
Módulo 11·02·25 min

JSON: serializar y deserializar

Los sistemas se hablan en JSON, un texto con nombres y valores. Apex lo convierte en objetos con JSON.deserialize y convierte tus objetos en JSON con JSON.serialize: tú solo defines el molde.

En Admin esEl mapeo de columnas de Data Loader: cada columna del archivo, a su campo

✓ En esta sub-lección

  1. 01Leer un JSON: objetos, listas y pares nombre-valor.
  2. 02Convertir un JSON en un objeto de Apex con una clase molde.
  3. 03Convertir objetos de Apex en JSON para enviarlos.

La nutria: ¿Te acuerdas? · Repaso de la lección 1

Antes de usar el cuerpo de una respuesta, ¿qué miras?

fetchRenewal devuelve un texto: {"erpCode":"ERP-100","amount":12500.00,"status":"PAID"}. Para saber el importe habría que buscar dentro con substring, y eso se rompe al primer cambio. Ese texto es , y Apex sabe convertirlo en un objeto con campos de verdad.

Leer un JSON

  • Las llaves { } encierran un objeto: una serie de pares «nombre»: valor.
  • Los corchetes [ ] encierran una lista de valores u objetos.
  • Los textos van entre comillas dobles; los números y true/false, sin comillas.

Del JSON al objeto: una clase molde

Apex
public class ErpRenewal {        // un atributo por cada nombre del JSON, con su mismo nombre
    public String erpCode;
    public Decimal amount;
    public String status;
}

ErpRenewal r = (ErpRenewal) JSON.deserialize(res.getBody(), ErpRenewal.class);
System.debug(r.amount);          // 12500.00, ya como Decimal
JSON.deserialize devuelve un Object genérico; el (ErpRenewal) de delante es el casting del Módulo 1. Para una lista: (List<ErpRenewal>) JSON.deserialize(body, List<ErpRenewal>.class).

LO QUE MANDA EL ERP

{"erpCode":"ERP-100","amount":12500.00,"status":"PAID"}

ErpRenewal

  • erpCode'ERP-100'
  • amount12500.00
  • status'PAID'

Cada nombre del JSON cae en el atributo que se llama igual.

Cambia el JSON que manda el ERP y mira cómo queda el objeto: qué se rellena, qué se ignora y qué se queda en null.

Si el JSON trae un nombre que tu clase no tiene, se ignora. Si tu clase tiene un atributo que el JSON no trae, se queda en null. Y el camino de vuelta es una línea: JSON.serialize(objeto) convierte cualquier objeto o lista de Apex en texto JSON, listo para setBody. Cuando no conoces la forma de antemano, JSON.deserializeUntyped te da un Map<String, Object> que recorres por nombre.

La nutria: El mapeo de columnas de Data Loader

En Data Loader yo mapeaba cada columna del CSV a su campo, y las columnas sin mapear se ignoraban. La clase molde es ese mapeo, escrito una vez: cada nombre del JSON cae en el atributo que se llama igual, y lo que no tiene sitio se queda fuera.

La nutria: ¿Y por qué no un Flow? Aquí Flow también lo lee

Con franqueza: la acción HTTP Callout de un flow hace esto con clics. Lee el JSON de la respuesta y monta el del cuerpo a partir de ejemplos que le das al configurarla, y para una forma fija funciona bien. Lo aprendes a mano por dos razones: lo necesitas en las lecciones que Flow no cubre (tu propia API, SOAP, reintentos), y cuando una integración falla, lo que aparece en el log es JSON, y hay que saber leerlo.