【发布时间】: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