javascript - 使用 Executescript 和 Javascript 合并 NiFi 中的 json 流文件

标签 javascript json apache-nifi

我目前正在尝试合并两个 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 尝试,我只需要你的帮助来弄清楚如何以正确的方式做到这一点。

最佳答案

我认为您可以使用带有参数的合并内容:

  • 合并格式:二进制
  • 标题:[
  • 页脚:]
  • 分界符:,

通过将两个 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
...

关于javascript - 使用 Executescript 和 Javascript 合并 NiFi 中的 json 流文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53515450/

相关文章:

javascript - 住所括号如何在 linting js 文件时考虑外部 JS 文件

Java - 从 URL 获取 JSON 数据

java - 如何在 Java 中使用 JSON Simple 创建 JSON

java - 使用java将json数据加载到Spark中的Pair RDD中

apache-nifi - 如何使用 Apache Nifi 将数据从 MySql 导入到 Hive 中?

javascript - 使用python从&lt;script&gt;中的javascript var中提取数据

java - 在运行时重新加载authorizers.xml文件

javascript - toDataURL HTML5 获取 Canvas 数据的其他方法有问题吗?

javascript - 在 REACT 中使用 js 和 css 旋转木马

javascript - 单击后更改按钮值