【问题标题】:Apache Nifi 1.6: crash Groovy scriptApache Nifi 1.6:崩溃 Groovy 脚本
【发布时间】:2020-05-27 21:59:42
【问题描述】:

在 Apache Nifi 中解析 json 中的 xml。在数据集有限的本地机器上,我的代码工作。在完整的数据集中,在服务器 Apache Nifi 上,当收集 JSON 时,某些值会导致错误。

完整脚本:

import groovy.json.*
import org.apache.commons.io.IOUtils
import java.nio.charset.StandardCharsets
import org.apache.nifi.processor.io.StreamCallback

def get_map(Node) {
    nodeRootName = Node.name() 
    if (Node.childNodes().size() == 0) {
        return [(nodeRootName): (Node.text())]
    } else {
        subMap = [(nodeRootName):[]]
        for (subNode in Node.childNodes()) {
            subMap.(subMap.keySet()[0]).add(get_map(subNode))    
        }
        return subMap
    }
}
def check = true
flowFile = session.get()
if(!flowFile) return
session.write(flowFile, {
    inputStream, outputStream ->
        def raw = IOUtils.toString(inputStream, 'UTF-8')
        def xml = new XmlSlurper().parseText(raw)
        def jsonObject = [(xml.nsiKTRUs.name()): []]
        for (node in xml.nsiKTRUs.childNodes()) {
            rootNodeName = node.name()
            nodeMap = [(rootNodeName): [data:[]]] 
            for (subNode in node.childNodes()[0].childNodes()) {
                if (subNode.name() != "cryptoSigns") {
                    nodeMap.position.data.add(get_map(subNode))
                }
            } 
        jsonObject.nsiKTRUs.add(nodeMap)
    }
        try {
            def json = new groovy.json.JsonBuilder( jsonObject )
            outputStream.write(json.getBytes(StandardCharsets.UTF_8))
        } catch(Exception ex) {
            check = false
            outputStream.write(ex.toString().getBytes(StandardCharsets.UTF_8))
        }
    } as StreamCallback
)
if (check) {
    session.transfer(flowFile, REL_SUCCESS)
} else {
    session.transfer(flowFile, REL_FAILURE)
}

错误日志: groovy.json.JsonException: 预期没有参数、单个映射、单个闭包或映射和闭包作为参数。

当我从服务器获取 LinkedHashMap 时出现错误,我在本地计算机上收到此错误: 意外输入:[[position:[data:[[code:01.11.11.111'@第 2 行第 47 列。 [[位置:[数据:[[代码:01.11.11.111-000(在此符号上:[[位置:[数据:[[代码:01.11.11.111-000)

Pastebin 上的完整错误图 https://pastebin.com/vLu6ES9Q

如何解决?

【问题讨论】:

  • 目前尚不清楚您如何“从服务器获取地图”,但我假设您正在打印地图,获取您在粘贴中看到的内容并尝试在某些本地脚本中使其工作:这个不能工作。 map 的 .toString() 仅对调试有用,没有序列化。另外,既然您已经有了地图,为什么还要使用 JsonBuilder?你试过docs.groovy-lang.org/latest/html/gapi/groovy/json/…

标签: groovy apache-nifi


【解决方案1】:

此代码中的问题:

def json = new groovy.json.JsonBuilder( jsonObject )      // <--- at this point `json` is a JsonBuilder object
outputStream.write(json.getBytes(StandardCharsets.UTF_8)) // JsonBuilder does not have .getBytes(StandardCharsets.UTF_8) method

添加.toString().toPrettyString() 应该可以解决问题

def json = new groovy.json.JsonBuilder( jsonObject ).toPrettyString()
outputStream.write(json.getBytes(StandardCharsets.UTF_8))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多