Capítulo 6: Formatos XML vs JSON-LD

Por: Artiko
epcisxmljson-ldformatointeroperabilidadepcis-2.0contexto-jsonld

Historia de los formatos

EPCIS 1.x (2007-2021) solo soportaba XML. Cada implementación tenía que parsear documentos XML con namespaces complejos. Con EPCIS 2.0 (2022), GS1 agregó JSON-LD como formato alternativo oficial, reconociendo que la mayoría de sistemas modernos trabajan con JSON.

Ambos formatos son semánticamente equivalentes: el mismo evento se puede representar en XML o en JSON-LD sin pérdida de información.

El mismo ObjectEvent en XML

Formato XML compatible con EPCIS 1.2 y 2.0:

<?xml version="1.0" encoding="UTF-8"?>
<epcis:EPCISDocument xmlns:epcis="urn:epcglobal:epcis:xsd:2"
                     schemaVersion="2.0"
                     creationDate="2026-03-21T10:00:00Z">
  <EPCISBody>
    <EventList>
      <ObjectEvent>
        <eventTime>2026-03-21T09:00:00Z</eventTime>
        <eventTimeZoneOffset>-03:00</eventTimeZoneOffset>
        <epcList>
          <epc>urn:epc:id:sgtin:0614141.107340.2026001</epc>
        </epcList>
        <action>OBSERVE</action>
        <bizStep>urn:epcglobal:cbv:bizstep:shipping</bizStep>
        <disposition>urn:epcglobal:cbv:disp:in_transit</disposition>
        <readPoint>
          <id>urn:epc:id:sgln:0614141.07346.1234</id>
        </readPoint>
      </ObjectEvent>
    </EventList>
  </EPCISBody>
</epcis:EPCISDocument>

El mismo ObjectEvent en JSON-LD

Formato JSON-LD exclusivo de EPCIS 2.0:

{
  "@context": "https://ref.gs1.org/standards/epcis/2.0.0/epcis-context.jsonld",
  "type": "EPCISDocument",
  "schemaVersion": "2.0",
  "creationDate": "2026-03-21T10:00:00Z",
  "epcisBody": {
    "eventList": [
      {
        "type": "ObjectEvent",
        "eventTime": "2026-03-21T09:00:00Z",
        "eventTimeZoneOffset": "-03:00",
        "epcList": ["urn:epc:id:sgtin:0614141.107340.2026001"],
        "action": "OBSERVE",
        "bizStep": "shipping",
        "disposition": "in_transit",
        "readPoint": { "id": "urn:epc:id:sgln:0614141.07346.1234" }
      }
    ]
  }
}

Diferencias clave

bizStep y disposition: URIs vs valores cortos

La diferencia más visible:

CampoXMLJSON-LD
bizStepurn:epcglobal:cbv:bizstep:shipping"shipping"
dispositionurn:epcglobal:cbv:disp:in_transit"in_transit"

En JSON-LD, el contexto (@context) contiene las reglas de expansión. Cuando un sistema procesa "shipping", el contexto lo resuelve automáticamente a la URI completa urn:epcglobal:cbv:bizstep:shipping.

En XML, no existe este mecanismo de resolución automática, por lo que se deben usar las URIs completas.

Nombres de campos

ConceptoXMLJSON-LD
Documento raíz<EPCISDocument>"type": "EPCISDocument"
Cuerpo<EPCISBody>"epcisBody"
Lista de eventos<EventList>"eventList"
Tipo de evento<ObjectEvent> (tag XML)"type": "ObjectEvent"
Lista de EPCs<epcList><epc>...</epc></epcList>"epcList": [...]
Punto de lectura<readPoint><id>...</id></readPoint>"readPoint": { "id": "..." }

XML usa PascalCase para elementos raíz y camelCase para propiedades. JSON-LD usa camelCase consistentemente.

Estructura del documento

XML requiere namespaces y declaraciones de schema:

<epcis:EPCISDocument xmlns:epcis="urn:epcglobal:epcis:xsd:2"
                     xmlns:cbvmda="urn:epcglobal:cbv:mda"
                     schemaVersion="2.0">

JSON-LD resuelve todo con una sola línea de contexto:

"@context": "https://ref.gs1.org/standards/epcis/2.0.0/epcis-context.jsonld"

El rol del contexto JSON-LD

El archivo de contexto en https://ref.gs1.org/standards/epcis/2.0.0/epcis-context.jsonld es un documento JSON que contiene mapeos como:

{
  "@context": {
    "epcis": "https://ref.gs1.org/standards/epcis/",
    "cbv": "https://ref.gs1.org/standards/cbv/",
    "ObjectEvent": "epcis:ObjectEvent",
    "bizStep": { "@id": "epcis:bizStep", "@type": "@vocab" },
    "shipping": "cbv:BizStep-shipping",
    "in_transit": "cbv:Disp-in_transit"
  }
}

Esto permite que los valores cortos se expandan a URIs completas cuando se procesan con un parser JSON-LD. Es lo que hace posible la interoperabilidad semántica: dos sistemas pueden intercambiar datos JSON-LD y entender exactamente el mismo significado.

Contextos personalizados

Puedes extender el contexto con tu propio vocabulario:

{
  "@context": [
    "https://ref.gs1.org/standards/epcis/2.0.0/epcis-context.jsonld",
    {
      "miempresa": "https://miempresa.com/epcis/",
      "miempresa:lotNumber": { "@type": "xsd:string" },
      "miempresa:temperature": { "@type": "xsd:decimal" }
    }
  ]
}

Esto permite agregar campos custom sin romper la compatibilidad con el estándar.

Conversión entre formatos

Herramientas de conversión

Consideraciones al convertir

  1. Pérdida de formato, no de datos: la conversión es lossless en términos de semántica, pero el formato cambia
  2. Namespaces XML → prefijos JSON-LD: los namespaces custom en XML deben mapearse a prefijos en el contexto JSON-LD
  3. Extensiones: las extensiones de usuario (userExtension en XML) se mapean a campos con prefijo en JSON-LD

Cuándo usar cada formato

Usar XML cuando:

Usar JSON-LD cuando:

Recomendación práctica

Si empiezas un proyecto nuevo, usa JSON-LD. Es más conciso, más fácil de debuggear y está alineado con la dirección futura del estándar. Solo usa XML si un socio comercial o regulación lo requiere.

Content-Type HTTP

Al enviar eventos por API REST, el header Content-Type indica el formato:

FormatoContent-Type
XMLapplication/xml
JSON-LDapplication/ld+json; profile="https://ref.gs1.org/standards/epcis/2.0.0/epcis-context.jsonld"

El header Accept del cliente indica qué formato prefiere recibir. Un servidor EPCIS 2.0 bien implementado debería soportar content negotiation entre ambos formatos.

Validación

XML Schema (XSD)

GS1 publica schemas XSD oficiales para validar documentos EPCIS XML:

JSON Schema

Para JSON-LD, GS1 publica JSON Schemas que validan la estructura del documento sin necesidad de un parser JSON-LD completo.

Ambos schemas están disponibles en el repositorio GitHub de GS1.

Próximo capítulo

En el capítulo 7 exploraremos la API REST de EPCIS 2.0: los endpoints estándar para captura y consulta de eventos.