Azure Data Factory中Lookup的item()含点字段解析问题
我之前也碰到过一模一样的情况,这个问题其实是ADF处理扁平化JSON属性的特性导致的:你从Salesforce返回的JSON数据是完全扁平化的结构,那些看起来像嵌套对象的带点字段(比如NVMStatsSF__Related_Lead__r.Email)其实是单个完整的属性名,而不是NVMStatsSF__Related_Lead__r对象下的Email子属性。ADF的点语法会把.当成对象层级的分隔符,所以当你写item().NVMStatsSF__Related_Lead__r.Email时,它会先去找item()里有没有NVMStatsSF__Related_Lead__r这个属性——但显然没有,因为你的属性名是完整的NVMStatsSF__Related_Lead__r.Email,这就是报错的核心原因。
正确的访问方式
改用方括号+引号的索引语法来访问这些带点的属性,这样ADF会把整个带点的字符串当作一个完整的属性名来解析:
比如:
- 原来的
item().NVMStatsSF__Agent__r.Name改成item()['NVMStatsSF__Agent__r.Name'] - 原来的
item().NVMStatsSF__Related_Lead__r.Email改成item()['NVMStatsSF__Related_Lead__r.Email'] - 原来的
item().NVMStatsSF__Related_Lead__r.FirstName改成item()['NVMStatsSF__Related_Lead__r.FirstName']
再确认你的数据结构
你提供的item()数据是标准的扁平化键值对:
{ "NVMStatsSF__Related_Lead__c": "00QE000egrtgrAK", "NVMStatsSF__Agent__r.Name": "ABC", "NVMStatsSF__Related_Lead__r.Email": "geggegg@gmail.com", "NVMStatsSF__Related_Lead__r.FirstName": "ABC", "NVMStatsSF__Related_Lead__r.OwnerId": "0025434535IIAW" }
所有带点的内容都是顶层属性,没有嵌套对象,所以必须用方括号索引的方式才能正确获取对应的值。
错误提示的佐证
你收到的错误信息其实已经说得很清楚了:
'item().NVMStatsSF__Related_Lead__r.Email' cannot be evaluated because property 'NVMStatsSF__Related_Lead__r' doesn't exist, available properties are 'NVMStatsSF__Related_Lead__c, NVMStatsSF__Agent__r.Name, NVMStatsSF__Related_Lead__r.Email, NVMStatsSF__Related_Lead__r.FirstName, NVMStatsSF__Related_Lead__r.OwnerId'.", "failureType": "UserError", "target": "WebActivityToAddPerson"
它明确列出了所有可用的属性都是完整的带点字符串,ADF根本不认为存在NVMStatsSF__Related_Lead__r这个嵌套对象,自然会报错。
这种情况在ADF处理Salesforce关联对象的Lookup结果时非常常见,因为Salesforce的关联字段会被自动扁平化为带点的属性名,记住用方括号索引就能轻松解决这个问题啦。
内容的提问来源于stack exchange,提问作者Gagan

