Saltar al contenido

¿Mapeo elegante de POJO a JsonObject de vertx.io?

Ya no tienes que buscar más por todo internet ya que estás al sitio exacto, contamos con la respuesta que quieres sin problemas.

Solución:

Acabo de enviar un parche a Vert.x que define dos nuevas funciones convenientes para convertir entre instancias de objetos JsonObject y Java sin la ineficiencia de pasar por un JSON intermedio. string representación. Esto será en la versión 3.4.

// Create a JsonObject from the fields of a Java object.
// Faster than calling `new JsonObject(Json.encode(obj))`.
public static JsonObject mapFrom(Object obj)

// Instantiate a Java object from a JsonObject.
// Faster than calling `Json.decodeValue(Json.encode(jsonObject), type)`.
public  T mapTo(Class type)

Internamente esto utiliza ObjectMapper#convertValue(...), consulte la respuesta de Tim Putnam para conocer las advertencias de este enfoque. El código está aquí.

No estoy seguro de haberte entendido correctamente, pero parece que estás tratando de encontrar una forma simple de convertir POJO a JsonObject.

Entonces, tenemos muchos pojos que enviamos por el EventBus como JsonObjects

He encontrado que la forma más fácil es usar el vert.xJson clase que tiene un montón de métodos de ayuda para convertir a / desde JsonStrings

JsonObject jsonObject = new JsonObject(Json.encode(myPojo));

A veces es necesario agregar algunos (des) serializadores personalizados, pero siempre nos quedamos con Jackson – eso es lo que Vert.x está usando para que funcionen fuera de la caja.

Lo que realmente hacemos es proporcionar una interfaz como la siguiente:

public JsonObjectSerializable 
    public JsonObject toJson();

Y todos nuestros pojos que necesitan ser enviados por el EventBus tiene que implementar esta interfaz.

Entonces nuestro EventBus el código de envío se parece a (simplificado):

public  Response dispatch(T eventPayload);

Además, como generalmente no hacemos pruebas unitarias de Pojos, agregamos esto interface alienta a los desarrolladores a realizar pruebas unitarias de su conversión.

Espero que esto ayude,

Será

Yo creo que Jackson ObjectMapper.convertValue(..) las funciones no se convierten a través de String, y Vert.x está usando Jackson para administrar JsonObject de todos modos.

JsonObject solo tiene un mapa subyacente que representa los valores, accesible a través de JsonObject.getMap()y un serializador/deserializador de Jackson en el público ObjectMapper instancia en io.vertx.core.json.Json.

Para cambiar entre JsonObject y un modelo de datos expresado en Pojos serializable con Jackson, puedes hacer:

JsonObject myVertxMsg = ...
MyPojo pojo = Json.mapper.convertValue ( myVertxMsg.getMap(), MyPojo.class );

Supongo que esto es más eficiente que pasar por una Cadena (pero es solo una suposición), y odio la idea de alterar la clase de datos solo para adaptarse al entorno, por lo que depende del contexto: forma versus rendimiento.

Para convertir de Pojo a JsonObjectconviértalo en un mapa con Jackson y luego use el constructor en JsonObject:

JsonObject myobj = new JsonObject ( Json.mapper.convertValue ( pojo, Map.class ));

  • Si ha implicado objetos JsonObjects o JsonArray anidados en su definición, se instanciarán como mapas y listas de forma predeterminada. JsonObject los volverá a envolver internamente cuando acceda a los campos que especifican esos tipos (por ejemplo, con getJsonArray(..).

  • Debido a que JsonObject es de forma libre y se está convirtiendo en un static type, es posible que tenga que lidiar con alguna UnrecognizedPropertyException no deseada. Puede ser útil crear su propio ObjectMapper, agregar el vertx JsonObjectSerializer y JsonArraySerializer, y luego realizar los cambios de configuración que se adapten (como DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES en Jackson).

Reseñas y valoraciones

Ten en cuenta dar visibilidad a esta noticia si lograste el éxito.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *