OpenDaylight:如何在MDSAL中简便存储JSON格式字符串?
嘿,这个问题我太有共鸣了——手动用构建器挨个设置JSON里的字段简直是噩梦,尤其是碰到嵌套深、字段多的YANG模型,不仅繁琐还容易漏填或者填错。其实OpenDaylight的MDSAL本身就提供了更优雅的解决方案,不用绕北向API,也不用跟构建器死磕,下面给你两种最常用的简便方法:
方法一:直接用MDSAL的JSON序列化工具转NormalizedNode写入
MDSAL自带了JsonNormalizedNodeSerializer,可以直接把JSON字符串解析成MDSAL能识别的NormalizedNode,然后直接写入数据存储。这种方法不需要依赖Binding生成的类,适合不想跟Java绑定类打交道的场景:
// 前提:你已经获取了DataBroker实例(通常通过依赖注入或者OSGi服务获取) JsonNormalizedNodeSerializer jsonSerializer = JsonNormalizedNodeSerializer.create(); String targetJson = "{\"your-yang-container\": {\"field1\": \"value1\", \"field2\": 123}}"; try { // 将JSON字符串解析为NormalizedNode NormalizedNode<?, ?> normalizedNode = jsonSerializer.fromJson(JsonNodeFactory.instance.textNode(targetJson)); // 构建数据存储路径(替换成你的YANG模型对应的InstanceIdentifier) InstanceIdentifier<?> dataPath = InstanceIdentifier.create(YourYangRootContainer.class); // 创建写入事务并提交 WriteTransaction writeTx = dataBroker.newWriteOnlyTransaction(); writeTx.put(LogicalDatastoreType.CONFIGURATION, dataPath, normalizedNode); ListenableFuture<Void> submitFuture = writeTx.submit(); Futures.addCallback(submitFuture, new FutureCallback<Void>() { @Override public void onSuccess(Void result) { System.out.println("JSON数据成功写入MDSAL"); } @Override public void onFailure(Throwable t) { System.err.println("写入失败:" + t.getMessage()); } }, MoreExecutors.directExecutor()); } catch (JsonNormalizedNodeSerializer.DeserializationException e) { System.err.println("JSON解析错误,可能与YANG模型不匹配:" + e.getMessage()); }
方法二:用Binding API的Jackson反序列化直接生成绑定对象
如果你的项目已经在用YANG模型生成的Binding Java类,那可以配合ODL的Jackson绑定模块,直接把JSON字符串反序列化成对应的Binding对象,然后写入数据存储。这种方法类型更安全,代码可读性也更高:
首先确保你的pom.xml里加了相关依赖(如果是Maven项目):
<dependency> <groupId>org.opendaylight.mdsal</groupId> <artifactId>mdsal-binding-jackson</artifactId> <version>你的ODL版本</version> </dependency>
然后代码示例:
// 初始化ObjectMapper并注册ODL的Binding模块 ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(new BindingJacksonModule()); String targetJson = "{\"your-yang-object\": {\"fieldA\": \"hello\", \"fieldB\": true}}"; try { // 直接反序列化为YANG对应的Binding对象 YourYangModelObject modelObject = objectMapper.readValue(targetJson, YourYangModelObject.class); // 构建数据路径 InstanceIdentifier<YourYangModelObject> dataPath = InstanceIdentifier.create(YourYangModelObject.class); // 写入数据存储 WriteTransaction writeTx = dataBroker.newWriteOnlyTransaction(); writeTx.put(LogicalDatastoreType.OPERATIONAL, dataPath, modelObject); // 提交事务并处理结果 ListenableFuture<Void> submitFuture = writeTx.submit(); // 这里也可以用CompletableFuture转换处理,看你项目的偏好 } catch (JsonProcessingException e) { System.err.println("JSON反序列化失败:" + e.getMessage()); }
一些关键注意事项
- 结构匹配:JSON的结构必须和YANG模型完全对应,包括命名空间(如果JSON里显式指定的话)、字段名(YANG的蛇形命名会自动映射到Java的驼峰命名,BindingJacksonModule会处理这个转换)。
- 数据存储类型:要区分是写入
CONFIGURATION还是OPERATIONAL数据存储,根据你的业务场景选择。 - 事务处理:MDSAL的事务必须提交,并且要处理提交成功/失败的回调,避免出现数据不一致的情况。
这两种方法都能帮你摆脱手动构建对象的繁琐,直接复用现成的JSON字符串,既高效又能减少人为错误。
内容的提问来源于stack exchange,提问作者LostInTheFrequencyDomain
相关产品推荐
相关产品推荐

