尝试使用NIFI从API REST解析odata4时出错

时间:2019-11-10 22:59:59

标签: json odata apache-nifi

我正在使用Microsoft REST API查询Azure应用程序,oauth和请求都没有问题。

InvokeHTTP的响应具有这种格式

{"@odata.context":"https://****.dynamics.com/api/data/v9.1/$metadata#endpoint","value":[ here comes the actual JSON result in format {
 "@odata_etag" : "W/\"555598\"", "field":"value...},...]
,"@odata.nextLink":"https://****.dynamics.com/api/data/v9.1/endpoint?$skiptoken.....}

我需要提取nextLink用于分页和Value才能继续流程并存储结果。 当我尝试使用inferAvroSchema进行解析时,我可以开始使用它引发此错误“非法的初始字符:@ odata.etag”

我的想法是先推断avroSchema,然后再评估EsonateJsonPath以提取odata标签,然后提取值。

我尝试在结果中使用EvaluateJsonPath,要求为$。@ odata.context创建一个属性,但是它也找不到该项目,我确定与@有关。

我也可以将传入流的所有@替换为另一个字符,但是不知道这是否有意义。

我感觉我没有使用正确的方法,但是NIFI + odata无法在google或此处为我提供结果。 我愿意接受任何建议!

谢谢!

2 个答案:

答案 0 :(得分:2)

模式字段不能包含@。您可以替换@,但是必须确保不要在电子邮件地址等实际内容中替换@。另一个解决方案是使用JoltTransformJSON处理器来转换API响应,以便您的流程可以使用它:

enter image description here

GenerateFlowFile:

enter image description here

对于JoltTransformJSON处理器,请提供以下Jolt规范:

[
  {
    "operation": "shift",
    "spec": {
      "\\@odata.nextLink": "next"
    }
  }
]

保留其他属性的默认值。您可以在此处与Jolt一起玩耍:http://jolt-demo.appspot.com/

EvaluateJsonPath:

enter image description here

结果:

enter image description here

请注意,URL现在已成为流文件属性的一部分。

答案 1 :(得分:1)

您的预感是正确的,您只能对正在使用的架构类型(avro或JSON)中的字段名称使用有效字符。 您可以使用replacetext处理器使NiFi移除非法字符,请在此处阅读有效内容:http://avro.apache.org/docs/current/spec.html#names