PDI(Kettle)中org.bson.Document转BasicBSONObject的实现方法
问题原因
直接强制类型转换失败的核心原因是:
org.bson.Document与org.bson.BasicBSONObject为平级的BSON实现类,二者均实现了Map<String,Object>与BSONObject接口,不存在继承关系,强转必然抛出ClassCastException。
可行实现方案
所有方案仅依赖MongoDB BSON原生API,无需额外安装任何组件,可直接在PDI UDJC步骤中使用。
方案1:简单场景快速转换
适用于JSON结构无嵌套,或嵌套元素不需要严格为BSONObject子类型的场景,代码量少执行效率高。
依赖导入
import org.bson.Document; import org.bson.BasicBSONObject;
实现代码
String mongoResultString = get(Fields.In, "mongoAsset").getString(r); Document mongoResultDoc = Document.parse(mongoResultString ); // 直接利用BasicBSONObject的Map构造器完成转换 BasicBSONObject mongoResult = new BasicBSONObject(mongoResultDoc);
方案2:全复杂嵌套结构兼容
适用于存在多层嵌套对象、数组的JSON结构,可完整转换全层级的BSON类型,不存在嵌套元素类型异常问题。
依赖导入
import org.bson.Document; import org.bson.BasicBSONObject; import org.bson.BSON; import org.bson.BSONObject;
实现代码
String mongoResultString = get(Fields.In, "mongoAsset").getString(r); Document mongoResultDoc = Document.parse(mongoResultString ); // 先编码为BSON字节流再解码为BasicBSONObject,全结构兼容 byte[] bsonBytes = BSON.encode(mongoResultDoc); BasicBSONObject mongoResult = (BasicBSONObject) BSON.decode(bsonBytes);
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

