Apache Nifi 1.6: cra sh Groovy скрипт - PullRequest
0 голосов
/ 27 мая 2020

В Apache Парсинг Нифи xml В json. На локальной машине с ограниченным набором данных мой код работает. В полном наборе данных, на сервере 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 из сервер с ошибкой, я получаю эту ошибку на локальном компьютере: Неожиданный ввод: [[позиция: [данные: [[код: 01.11.11.111 '@ строка 2, столбец 47. [[позиция: [данные: [ [код: 01.11.11.111-000 (на этом символе: [[позиция: [данные: [[код: 01.11. 1 1.111-000)

Полная карта ошибок на Pastebin https://pastebin.com/vLu6ES9Q

Как исправить?

1 Ответ

2 голосов
/ 27 мая 2020

проблема в этом коде:

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))
...