我目前正在研究vertx.io应用程序,并希望使用提供的mongo api进行数据存储.我目前在股票JsonObject类之上有一个相当笨重的抽象,其中所有get
和set
方法都被替换为:
this.backingObject.get(KEY_FOR_THIS_PROPERTY);
Run Code Online (Sandbox Code Playgroud)
现在这一切都很好,但它不会特别好地扩展.它看起来也很脏,特别是在使用嵌套数组或对象时.例如,如果我希望只有在知道实际数据时才能填充字段,我必须检查数组是否存在,以及它是否不创建它并将其存储在对象中.然后我可以在列表中添加一个元素.例如:
if (this.backingObject.getJsonArray(KEY_LIST) == null) {
this.backingObject.put(KEY_LIST, new JsonArray());
}
this.backingObject.getJsonArray(KEY_LIST).add(p.getBackingObject());
Run Code Online (Sandbox Code Playgroud)
我曾考虑过潜在的解决方案,但并不特别喜欢它们.也就是说,我可以使用Gson或一些带有注释支持的类似库来处理加载对象以便在我的代码中操作数据,然后使用Gson和Vertx的序列化和反序列化函数来转换格式,(vertx to load data -> json string -> gson to parse json into pojos -> make changes -> serialize to json string -> parse with vertx and save)
但这是一个真正粗暴和低效的工作流程.我也可能想出一些扩展/实现vertx json库的抽象包装器,但是将所有功能传递给gson,但这看起来似乎也很多.
有没有什么好方法可以使用vertx实现更友好和可维护的序列化?
Luk*_*son 31
我刚刚向Vert.x提交了一个补丁,它定义了两个新的便捷函数,用于在JsonObject和Java对象实例之间进行转换,而不会经历中间JSON字符串表示的低效率.这将是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> T mapTo(Class<T> type)
Run Code Online (Sandbox Code Playgroud)
在内部使用ObjectMapper#convertValue(...)
,请参阅Tim Putnam对这种方法的警告的回答.代码在这里.
不确定我是否理解正确,但听起来你正试图找到一种将POJO转换为JsonObject的简单方法?
所以,我们有很多的POJO,我们送过来的EventBus
作为JsonObject
小号
我发现最简单的方法是使用vert.x
Json
具有大量辅助方法的类来转换为/Json
Strings
JsonObject jsonObject = new JsonObject(Json.encode(myPojo));
Run Code Online (Sandbox Code Playgroud)
有时您需要添加一些自定义(de)序列化程序,但我们始终坚持Jackson
- 这Vert.x
就是使用它,因此它们开箱即用.
我们实际做的是提供如下界面:
public JsonObjectSerializable {
public JsonObject toJson();
}
Run Code Online (Sandbox Code Playgroud)
我们所有需要发送的pojos EventBus
都必须实现这个接口.
然后我们的EventBus
发送代码看起来像(简化):
public <T extends JsonObjectSerializable> Response<T> dispatch(T eventPayload);
Run Code Online (Sandbox Code Playgroud)
此外,由于我们通常不对Pojos进行单元测试,因此添加此项可以interface
鼓励开发人员对其转换进行单元测试.
希望这可以帮助,
将
小智 7
我相信Jackson的ObjectMapper.convertValue(..)
功能不会通过String进行转换,Vert.x也会使用Jackson来管理JsonObject.
JsonObject
只有一个底层映射表示值,可以访问JsonObject.getMap()
,并ObjectMapper
在io.vertx.core.json.Json中的公共实例上有一个Jackson序列化器/反序列化器.
要JsonObject
在与Jackson可序列化的Pojos中表示的数据模型之间切换,您可以:
JsonObject myVertxMsg = ...
MyPojo pojo = Json.mapper.convertValue ( myVertxMsg.getMap(), MyPojo.class );
我猜这比通过String更有效(但它只是一个猜测),我讨厌改变数据类只是为了适应环境的想法,所以它取决于上下文 - 形式与性能.
要从Pojo转换为JsonObject
,转换为Jackson的地图,然后使用构造函数JsonObject
:
JsonObject myobj = new JsonObject ( Json.mapper.convertValue ( pojo, Map.class ));
如果您在定义中隐含了嵌套的JsonObjects或JsonArray对象,则默认情况下它们将实例化为Maps和Lists.当您访问指定这些类型的字段时,JsonObject将在内部重新包装这些类型(例如,使用getJsonArray(..)).
因为JsonObject是自由形式的并且您正在转换为静态类型,所以您可能会遇到一些不需要的UnrecognizedPropertyException来处理.创建自己的ObjectMapper,添加vertx JsonObjectSerializer和JsonArraySerializer,然后进行配置更改以适应(例如DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
在Jackson中)可能很有用.
归档时间: |
|
查看次数: |
21397 次 |
最近记录: |