在Talend中用tJava/tJavaRow提取MongoDB对象类型数据的Java方案
在Talend中拆分MongoDB嵌套address字段为扁平字段的Java实现
当前输出示例
{ "id": "123", "name": "John Doe", "address": { "address": "123 Main St", "area": "Downtown", "city": "New York", "zipcode": "10001" } }
期望输出示例
{ "id": "123", "name": "John Doe", "address_address": "123 Main St", "address_area": "Downtown", "address_city": "New York", "address_zipcode": "10001" }
实现方案
根据address字段在Talend中的数据类型,分两种场景处理:
场景1:address为org.bson.Document类型(直接从MongoDB读取的原生Object)
在tJavaRow组件的Main代码区写入以下代码:
// 获取输入的address Document对象 org.bson.Document addressDoc = input_row.address; // 映射基础字段 output_row.id = input_row.id; output_row.name = input_row.name; // 拆分嵌套address字段,空值处理避免空指针异常 if (addressDoc != null) { output_row.address_address = addressDoc.getString("address"); output_row.address_area = addressDoc.getString("area"); output_row.address_city = addressDoc.getString("city"); output_row.address_zipcode = addressDoc.getString("zipcode"); } else { // 空值时赋值空字符串,可根据需求改为null output_row.address_address = ""; output_row.address_area = ""; output_row.address_city = ""; output_row.address_zipcode = ""; }
前置要求:
- 提前在
tJavaRow的输出Schema中添加address_address、address_area、address_city、address_zipcode字段,类型与原嵌套字段一致(示例为String) - 输入的address字段类型需配置为
org.bson.Document
场景2:address为JSON格式字符串
若address字段以JSON字符串形式存在,使用Talend自带的org.json库解析,代码如下:
import org.json.JSONObject; // 获取输入的address JSON字符串 String addressJsonStr = input_row.address; // 映射基础字段 output_row.id = input_row.id; output_row.name = input_row.name; // 解析JSON并拆分字段 if (addressJsonStr != null && !addressJsonStr.isEmpty()) { JSONObject addressJson = new JSONObject(addressJsonStr); // 使用optString避免字段不存在时抛出异常,第二个参数为默认值 output_row.address_address = addressJson.optString("address", ""); output_row.address_area = addressJson.optString("area", ""); output_row.address_city = addressJson.optString("city", ""); output_row.address_zipcode = addressJson.optString("zipcode", ""); } else { output_row.address_address = ""; output_row.address_area = ""; output_row.address_city = ""; output_row.address_zipcode = ""; }
注意事项:
- Talend默认自带
org.json依赖,无需额外引入 - 输出Schema需提前定义所有目标扁平字段
内容的提问来源于stack exchange,提问作者Jayven Javier
相关产品推荐
相关产品推荐

