javascript - 使用带有 Javascript 的 Executescript 在 NiFi 中合并 json 流文件
问题描述
我目前正在尝试合并两个 Json 文件——一个是嵌套的,一个是平面的:
"ampdata": [
{
"nr": "303",
"code": "JGJGh4958GH",
"Anr": "AVAILABLE",
"ability": [ "" ],
"type": "wheeled",
"conns": [
{
"nr": "447",
"status": "",
"version": "3",
"format": "sckt",
"amp": "32",
"vol": "400",
"vpower": 22
}
]
}
[ {
"nr" : 91643421,
"Anr" : "Real",
"Title" : null,
"Comp" : null,
"Name" : "Smith",
"CompanyName" : "WhiteC"
}]
我目前的方法是:
var flowFile = session.get();
if (flowFile != null) {
var StreamCallback = Java.type("org.apache.nifi.processor.io.StreamCallback")
var IOUtils = Java.type("org.apache.commons.io.IOUtils")
var StandardCharsets = Java.type("java.nio.charset.StandardCharsets")
flowFile = session.write(flowFile,
new StreamCallback(function(inputStream, outputStream) {
var text = IOUtils.buffer(inputStream)
var obj = JSON.parse(text)
var neu = [];
var neuesObjekt = {};
for (var i = 0; i < obj.ampdata.length; i++) {
var entry = obj.ampdata[i];
if(obj.ampdata[i].nr != obj2.nr) {
obj2.nr = obj.ampdate[i].nr
}
}
outputStream.write(JSON.stringify(newObj, null, '\t').getBytes(StandardCharsets.UTF_8))
}))
flowFile = session.putAttribute(flowFile, "filename", flowFile.getAttribute('filename').split('.')[0]+'_translated.json')
session.transfer(flowFile, REL_SUCCESS)
如何解析同时传入的两个流文件?我确实喜欢同时与两者一起工作,因为我必须在多个位置上比较它们。我不知道如何避免覆盖第一个流文件。
我有另一种使用 MergeConent-Processor 的方法,但结果只是两个 Json 以不再是有效 Json 的方式连接。无论如何,我确实更喜欢 Javascript 尝试,我只需要您的帮助来弄清楚如何以正确的方式进行操作。
解决方案
我认为您可以使用带有参数的合并内容:
- 合并格式:
binary
- 标题:
[
- 页脚:
]
- 分界符:
,
通过将两个 json 文件合并为一个,将产生一个有效的 json(数组)。
然后,如果您需要重新格式化 json - 您仍然可以使用 ExecuteScript 处理器...
并且您不需要实现连接文件逻辑。
PS:要从输入队列中获取两个文件,请使用这种类型的代码:
var flowFiles = session.get(2);
if(!flowFiles)return;
if(flowFiles.size()!=2){
session.transfer(flowFiles); //return files back to input queue
return;
}
//we have exactly two files. let's process them...
var flowFile1 = flowFiles[0];
var flowFile2 = flowFiles[1];
//read each, parse, apply logic, write result
...
推荐阅读
- c# - selenium 在 TextField 中输入值或单击排序增量和减量按钮的减量箭头
- python - 为什么模型只对给定月份的前 5 天进行预测
- laravel - 升级到 Laravel 7.0 的问题 / Socilate 要求似乎已被弃用
- python - 有效管理多条折线图(45条独特的线)
- javascript - 在 reactjs 中使用自定义 Web 组件的最佳方式
- python-3.x - python中的3d弯曲箭头
- android - Kotlin Android:如何访问不同文件中的按钮?
- spring - 如何使用 gradle 插件在 Spring Boot 中打开构建包生成的 docker 镜像的分层
- python - 我试图读取在我的 Python 程序中以文本形式写入的日志文件,但它返回“没有这样的文件或目录”
- c# - API调用代码在本地主机上工作但不在服务器上