如何在 Talend 中解析动态 JSON 模式

How to parse a dynamic JSON schema in Talend

我有一个 API returns 一个 JSON,但是相同的字段有时作为对象返回,有时作为基于可用数据的数组返回,我是使用 tExtractJsonFields 组件并且它无法处理模式中的这种变化,让我们以“stage_is”字段为例:对于一个调用 API returns this :

{ “stage_id”:[ 1、 “新的” ] }

要获取 ID,应以这种方式解析它 stage_id[0]

再打一次电话,我会得到这个:

{ “stage_id”:1 }

现在它被解析成这样:stage_id

有什么已知的方法可以处理这个问题吗?在开始使用 tSystem 组件之类的东西并使用外部工具或 bash 脚本来解决这个问题之前,我试图寻找最简单的解决方案,提前感谢你们的帮助。

因为你有一个错误的例子只是给你一个想法。

void Main()
{
    //array
    var j = "{\"stage_id\":[{\"id\":1,\"val\":\"New\"}]}";
    Test res = JsonConvert.DeserializeObject<Test>(j).Dump();
    //one rec
    j = "{\"stage_id\": 1 }";
    res = JsonConvert.DeserializeObject<Test>(j).Dump();
}

public class Test
{
    public object stage_id {get;set;}
}

不幸的是,Talend 不处理动态 json 或者至少我不知道有任何使用本机组件的解决方案。
我建议你在解析它之前修改你的 json,这样 stage_id 总是一个数组,这样你就可以用 stage_id[0] 解析它,就像这样:

通过在 tExtractJSONFields 之前放置一个 tReplace 组件,并使用此正则表达式

(\"stage_id\"\s*:\s*)(\d+)

作为替换字符串:\[\]

这将搜索出现的 stage_id 后跟一个数字,并用方括号括起该数字。
所以,{ "stage_id":1 } 变成 { "stage_id":[1] }
如果你得到 { "stage_id":[1, "New"] } 它将不匹配正则表达式并且不会被修改。

tExtractJSONFields with stage_id[0] 然后将在两种情况下解析它。