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 JsonObject
s
He encontrado que la forma más fácil es usar el vert.x
Json
clase que tiene un montón de métodos de ayuda para convertir a / desde Json
Strings
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 JsonObject
convié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.