kettle从入门到精通 第107课 ETL之kettle json_input 一个点号引发的血案

场景:在一个kettle交流群内,有一个小伙伴求助:大致意思是json input的输入参数的key中存在点号,凡是带点号的key都无法正确获取。

今天一起来分析下使用多种方式来解决这个问题,希望后续有人遇到此类问题时可以秒杀它,而不是花费N根头发!!!

8746369011430d419de78c90fe441cd0

 1、json数据构造

{
    "id": "1",
    "eng.name": "javaxiaojingang",
    "chn.name": "Java小金刚"
}

上述json数据中,eng.name和chn.name 两个key中都有点号。

2、json input 提取

1)使用$.eng.name和$.'eng.name' 都无法提取到该key的值,输出为null,如下图所示

6380e2c6-8fe7-4968-8efc-f182ee065aa3

 2)使用javascript步骤将key中的点号替换为_

脚本如下:

function replaceDotInKeys(obj) {
    if (typeof obj!== 'object' || obj === null) {
        return obj;
    }
    if (Array.isArray(obj)) {
        var result = [];
        for (var i = 0; i < obj.length; i++) {
            result.push(replaceDotInKeys(obj[i]));
        }
        return result;
    }
    var newObj = {};
    for (var key in obj) {
        var newKey = key.replace(/\./g, '_');
        newObj[newKey] = replaceDotInKeys(obj[key]);
    }
    return newObj;
}

var jsonObj = JSON.parse(jsonStr);
// 处理对象的键
var newObj = replaceDotInKeys(jsonObj);
// 将处理后的对象转换回 JSON 字符串
var newJsonStr = JSON.stringify(newObj);

 

e0dfd870-6382-4400-b1c2-843885a7cf8c

 使用$.eng_name 进行提取key的值即可

a77fecd5-02ad-4064-b82b-9265508f7b09

3)使用$.['eng.name'] 方式提取

群里一个小伙伴经过一番研究源码&测试之后发现支持这种方式可以直接提取,如下图所示:

3e6ddc92-95ba-453a-bd6f-f19138d0e4f2

3、使用python插件提取

 python代码如下:

import json

# 定义 JSON 字符串

try:
    # 将 JSON 字符串解析为 Python 字典
    data = json.loads(jsonStr)
   # 提取 id 的值
    id = data.get('id')
    # 提取 chn.name 的值
    chnName = data.get('chn.name')
except json.JSONDecodeError:
    print("输入的不是有效的 JSON 字符串。")

cfd44372-6e80-4cd1-bc22-588fcd220d9e

 写在最后

小伙伴们,你们还有其他的解决方法吗?欢迎评论区留言探讨。

image

 

posted @ 2025-09-14 22:04  慕容尘轩  阅读(56)  评论(0)    收藏  举报