我有一个JSON格式的属性(由REST服务生成并由invokeHTTP处理器捕获),如下所示:
test => {"key":"value"}
然后我想使用JOLT处理器将其放入流JSON内容中,我的内容是这样的:
{
"id": 123,
"user": "foo"
}
我的JOLT规范是这样的:
[{
"operation": "default",
"spec": {
"interest": "${test}"
}
}]
这里的问题是,在具有测试属性nifi的JOLT高级窗口中,无法放置json对象并显示此错误:
“转换期间发生错误”
当运行处理器时,该详细错误将被警告:
“无法将json解组到对象”
我想要的结果是这样
{
"id": 123,
"user": "foo",
"interest": {"key":"value"}
}
另一个可能的问题是...我是否选择正确的解决方案来克服这种情况? 我有一个流,其中包含JSON内容,并且具有发送到REST服务的invokeHTTP,然后将响应存储在属性中,然后使用JOLT处理器,我将它们组合在一起(属性中以前的JSON和新的JSON)
答案 0 :(得分:1)
当您具有与流文件
相关联的 test 属性时ReplaceText
处理器而不是JoltTransformJson
替换文本配置:
搜索值
}
替换价值
,"interest": ${test}}
字符集 UTF-8 最大缓冲区大小
1 MB
替换策略
Literal Replace
评估模式
Entire text
{"id": 123,"user": "foo"}
输出:
{"id": 123,"user": "foo","interest": {"key":"value"}}
答案 1 :(得分:1)
我在Nifi 1.6.0中也遇到了相同的问题,高级编辑器转换了输入而没有问题,但是自动处理失败。我收到的错误:
due to com.bazaarvoice.jolt.exception.JsonUnmarshalException: Unable to unmarshal JSON to an Object.: Unable to unmarshal JSON to an Object
事实证明,问题是输入中一些未转义的Unicode字符不可见,并且在调试时在复制/粘贴时丢失了。要修复它并发现错误,我为每个属性添加了“:escapeJson()”。例如:
{"key":${myvalue:escapeJson()}}
然后查看输出流文件,我可以确定引起问题的属性。
我找到的相同解决方案也发布在这里: https://community.cloudera.com/t5/Support-Questions/JoltTransformation-unable-to-marshal-json/m-p/230679/highlight/true#M192526