How do I change the color of an event on my calendar notion?

Eventos JSON: Representación, Ventajas y Uso en Esper EPL

hace 10 años

★★★★★Valoración: 4.15 (1011 votos)

En el mundo del procesamiento de eventos complejos (CEP), la eficiencia y la flexibilidad en el manejo de datos son primordiales. Los eventos JSON emergen como una solución robusta y versátil para representar datos estructurados, especialmente en plataformas como Esper EPL. Este artículo te guiará a través del concepto de eventos JSON, explorando sus ventajas, métodos de declaración, manejo de propiedades dinámicas y las herramientas que Esper EPL proporciona para su procesamiento efectivo.

Índice de Contenido

¿Qué es un Evento JSON?

Un evento JSON, en el contexto de Esper EPL y sistemas similares, no es más que la representación de un evento utilizando el formato JSON (JavaScript Object Notation). JSON es un formato ligero de intercambio de datos, fácil de leer y escribir tanto para humanos como para máquinas. Se basa en una estructura de pares clave-valor y listas ordenadas, lo que lo hace ideal para representar datos estructurados de manera clara y organizada.

What is event in FullCalendar?
Event Object. A JavaScript object that FullCalendar uses to store information about a calendar event. It is exposed in various places of the API such as getEventById and provides methods for dynamic manipulation. It was originally parsed from a plain object.

Cuando hablamos de eventos JSON en Esper EPL, nos referimos a cadenas de texto formateadas en JSON que contienen la información relevante sobre un evento. Cada propiedad del evento se convierte en una propiedad del objeto JSON. Por ejemplo, un evento que representa la actualización de la ubicación de un coche podría representarse en JSON de la siguiente manera:

{ "carId": "A123456", "direction": 1 } 

Aquí, carId y direction son las propiedades del evento, representadas como claves en el objeto JSON, y "A123456" y 1 son sus respectivos valores.

Ventajas de Utilizar JSON para Eventos

La adopción de JSON como representación de eventos ofrece múltiples ventajas, que contribuyen a la eficiencia y la facilidad de uso en sistemas de procesamiento de eventos:

  • Simplicidad y Legibilidad: JSON es inherentemente simple y legible. Su sintaxis clara facilita la comprensión de la estructura de los datos tanto para desarrolladores como para sistemas.
  • Fiabilidad y Rapidez: JSON es un formato ligero que se analiza y genera rápidamente. Su procesamiento eficiente reduce la latencia en el flujo de eventos, crucial en aplicaciones de tiempo real.
  • Amplia Adopción y Soporte: JSON cuenta con un amplio soporte en diversos lenguajes de programación y plataformas. Existen numerosas bibliotecas y herramientas para trabajar con JSON, facilitando su integración en diferentes entornos.
  • Serialización y Transmisión de Datos Estructurados: JSON es ideal para serializar y transmitir datos estructurados a través de redes o entre sistemas. Su formato estándar asegura la interoperabilidad y facilita el intercambio de información.
  • Integración con Esper EPL: El compilador EPL de Esper genera un analizador JSON de alto rendimiento específicamente para el tipo de evento JSON definido. Esto optimiza el procesamiento y la lectura de propiedades sin necesidad de recorrer todo el documento, mejorando significativamente el rendimiento.
  • Sistema de Tipos Integral: Los eventos JSON se integran en el sistema de tipos de Esper EPL, similar a los eventos Map y array de objetos. Esto reduce la necesidad de utilizar clases Java como tipos de eventos, simplificando el desarrollo y la gestión.

Declaración de Tipos de Eventos JSON con `create json schema`

Para utilizar eventos JSON en Esper EPL, es necesario definir el tipo de evento y su esquema JSON utilizando la sintaxis create json schema. Esta declaración informa a Esper EPL sobre la estructura de los eventos JSON entrantes, permitiéndole procesarlos correctamente.

La sintaxis básica para declarar un esquema JSON es la siguiente:

@public @buseventtype create json schema NombreDelEsquema(propiedad1 tipo1, propiedad2 tipo2, ...) 
  • @public: Indica que el tipo de evento tiene visibilidad pública y puede ser referenciado desde diferentes partes de la aplicación.
  • @buseventtype: Especifica que la aplicación puede utilizar sendEventJson para enviar eventos de este tipo.
  • NombreDelEsquema: Es el nombre que se le asigna al tipo de evento JSON.
  • (propiedad1 tipo1, propiedad2 tipo2, ...): Define las propiedades del evento y sus respectivos tipos de datos (string, int, etc.).

Ejemplo: Declaración de un evento `CarLocUpdateEvent`

@public @buseventtype create json schema CarLocUpdateEvent(carId string, direction int) 

Este esquema define un tipo de evento llamado `CarLocUpdateEvent` con dos propiedades: `carId` de tipo string y `direction` de tipo entero. Una vez definido el esquema, se pueden enviar eventos JSON a Esper EPL utilizando el método sendEventJson:

String event = "{" + " \"carId\": \"A123456\", " + " \"direction\": 1 " + "}"; runtime.getEventService().sendEventJson(event, "CarLocUpdateEvent"); 

Y se pueden crear sentencias EPL para procesar estos eventos:

select count(*) from CarLocUpdateEvent(direction = 1)#time(1 min) 

Objetos JSON Anidados

JSON permite la anidación de objetos, lo que significa que un objeto JSON puede contener otros objetos JSON o arrays de objetos JSON. Para trabajar con objetos anidados en Esper EPL, es necesario definir esquemas para cada nivel de anidación, comenzando por los objetos anidados y luego los esquemas que los utilizan.

Ejemplo: Objeto JSON con objetos anidados `author` y `editor`

{ "isbn": "123-456-222", "author": { "lastname": "Doe", "firstname": "Jane" }, "editor": { "lastname": "Smith", "firstname": "Jane" }, "title": "The Ultimate Database Study Guide", "category": ["Non-Fiction", "Technology"] } 

Para este ejemplo, primero se define el esquema para el objeto anidado `Names` y luego el esquema `BookEvent` que utiliza `Names` para las propiedades `author` y `editor`:

create json schema Names(lastname string, firstname string); @public @buseventtype create json schema BookEvent(isbn string, author Names, editor Names, title string, category string[]); 

Se puede acceder a las propiedades de los objetos anidados en EPL utilizando la notación de punto:

select isbn, author.lastname as authorName, editor.lastname as editorName, category[0] as firstCategory from BookEvent 

Propiedades de Eventos JSON Dinámicas

En ocasiones, el esquema de los eventos JSON puede no ser completamente conocido de antemano. Para manejar esta situación, Esper EPL permite definir propiedades dinámicas en los eventos JSON. Esto se logra utilizando la anotación @JsonSchema(dynamic=true) al declarar el esquema.

Cuando se define un esquema como dinámico, el analizador JSON de Esper EPL no descarta las propiedades JSON cuyos nombres no coinciden con las propiedades definidas en el esquema. En cambio, todas las propiedades del documento JSON se mantienen disponibles en el objeto evento.

Para acceder a las propiedades dinámicas en EPL, se utiliza el operador ? después del nombre del evento y el nombre de la propiedad. El tipo de dato de la propiedad dinámica se determina automáticamente según el valor JSON:

  • String JSON: String
  • Número JSON: Integer (o Double si contiene decimales)
  • Booleano JSON: Boolean
  • Null JSON: null
  • Objeto JSON: Map<String, Object>
  • Array JSON: Object[]

Ejemplo: Esquema JSON dinámico para eventos de sensor

@JsonSchema(dynamic=true) @public @buseventtype create json schema SensorEvent() 

Se puede enviar un evento JSON con propiedades desconocidas previamente:

{ "entityID":"cd9f930e", "temperature": 70, "status": true, "entityName":{ "english":"Cooling Water Temperature" }, "vt":["2014-08-20T15:30:23.524Z"], "flags": null } 

Y consultar las propiedades dinámicas en EPL:

select entityID? as entityId, temperature? as temperature, status? as status, entityName? as entityName, vt? as vt, flags? as flags from SensorEvent 

API para Analizar y Construir Documentos JSON

Esper EPL proporciona APIs para el manejo de documentos JSON, tanto para analizarlos (parsing) como para construirlos. Estas APIs permiten una interacción más directa con el formato JSON desde el código de la aplicación.

API para Analizar Documentos JSON

La API de análisis permite parsear texto JSON sin procesar directamente a objetos evento. Esto se realiza a través de los siguientes pasos:

  1. Definir el esquema del evento JSON utilizando create json schema.
  2. Obtener una instancia de EventSenderJson para el tipo de evento deseado utilizando runtime.getEventService().getEventSender("NombreDelEsquema").
  3. Invocar el método parse(json) en la instancia de EventSenderJson, pasando la cadena JSON como argumento. Este método retorna un objeto JsonEventObject.

Ejemplo: Análisis de JSON con `EventSenderJson`

EventSenderJson sender = (EventSenderJson) runtime.getEventService().getEventSender("CarLocUpdateEvent"); JsonEventObject eventObject = sender.parse(json); 

API para Construir Documentos JSON

Esper EPL incluye una copia sombreada de la librería MinimalJson, que permite construir texto JSON mediante una API fluida. MinimalJson proporciona clases como JsonObject y JsonArray para crear estructuras JSON de forma programática.

Ejemplo: Construcción de JSON con MinimalJson

JsonObject jsonObject = new JsonObject() .add("carId", "A123456") .add("direction", 1); String json = jsonObject.toString(); 

Personalización de la Serialización y Deserialización JSON

Esper EPL permite personalizar la forma en que se serializan y deserializan las propiedades de eventos JSON utilizando la anotación @JsonSchemaField. Esta anotación se puede utilizar tanto en create json schema como en @EventRepresentation('json').

La anotación @JsonSchemaField permite especificar un adaptador personalizado, una clase que implementa la interfaz JsonFieldAdapterString. Este adaptador se encarga de convertir un valor de cadena JSON a un tipo de dato específico durante la deserialización (método parse) y de convertir un valor de un tipo de dato específico a una cadena JSON durante la serialización (método write).

Ejemplo: Personalización de la deserialización de fechas

Supongamos que se recibe un evento JSON con una propiedad de fecha en formato dd-M-yyyy y se desea convertirla a un objeto Date de Java. Se puede crear un adaptador personalizado como MyDateJSONParser:

public class MyDateJSONParser implements JsonFieldAdapterString<Date> { public Date parse(String value) { try { return value == null ? null: new SimpleDateFormat("dd-M-yyyy").parse(value); } catch (ParseException e) { throw new EPException("Failed to parse: " + e.getMessage(), e); } } public void write(Date value, JsonWriter writer) throws IOException { if (value == null) { writer.writeLiteral("null"); return; } writer.writeString(new SimpleDateFormat("dd-M-yyyy").format(value)); } } 

Y luego utilizar la anotación @JsonSchemaField en la declaración del esquema:

@JsonSchemaField(name=myDate, adapter=MyDateJSONParser) create json schema JsonEvent(myDate Date) 

Personalización de la Clase de Evento JSON

En lugar de definir las propiedades y tipos de datos directamente en la declaración create json schema, se puede especificar una clase de aplicación Java existente para representar los eventos JSON. Esto se hace utilizando la anotación @JsonSchema(className='NombreDeLaClase').

La clase de aplicación debe tener campos públicos que correspondan a las propiedades del evento JSON. Esper EPL inspecciona la clase y determina el esquema JSON basado en los tipos de datos de los campos públicos.

Ejemplo: Utilización de una clase de aplicación `PersonEvent`

public class PersonEvent { public String name; public UUID id; } 

Se puede declarar un esquema JSON que utilice esta clase:

@public @buseventtype @JsonSchema(className='PersonEvent') create json schema JSONPersonEvent() 

Al utilizar una clase de aplicación, se deben tener en cuenta las siguientes restricciones:

  • No se pueden definir campos adicionales en el esquema que no estén presentes en la clase de aplicación.
  • No se puede definir un supertipo para el tipo de evento.
  • No se puede utilizar la bandera dynamic para propiedades dinámicas.

Preguntas Frecuentes

  1. ¿Qué sucede si un evento JSON no coincide con el esquema definido?
    Esper EPL no valida los eventos JSON por defecto. Es responsabilidad de la aplicación asegurar que los eventos JSON enviados coincidan con el esquema declarado. Si un evento no coincide, el comportamiento puede ser impredecible y podría generar errores en el procesamiento.
  2. ¿Puedo tener múltiples subtipos para un evento JSON?
    Un tipo de evento JSON solo puede tener un único supertipo, y este supertipo también debe ser un tipo de evento JSON.
  3. ¿Cómo manejo errores al parsear JSON?
    Esper EPL genera un analizador JSON de alto rendimiento, pero los errores de parsing pueden ocurrir si el JSON no está bien formado. Es importante validar la generación y el formato de los eventos JSON en la aplicación para evitar errores de parsing.
  4. ¿Qué tipos de datos JSON son soportados?
    Esper EPL soporta los tipos de datos JSON estándar: String, Number, Boolean, Null, Object y Array. Además, permite la integración con tipos de datos Java como UUID, Date, y enumeraciones, así como listas y arrays de objetos de aplicación.

Conclusión

Los eventos JSON representan una forma eficiente y flexible de trabajar con datos estructurados en Esper EPL. Su simplicidad, rendimiento y amplio soporte los convierten en una opción ideal para aplicaciones de procesamiento de eventos complejos. A través de la declaración de esquemas JSON, el manejo de objetos anidados y propiedades dinámicas, y las APIs proporcionadas por Esper EPL, los desarrolladores pueden integrar y procesar eventos JSON de manera efectiva, optimizando el rendimiento y la claridad en sus aplicaciones de CEP.

Subir