无法将json解组到对象

时间:2018-12-10 15:23:53

标签: json apache-nifi jolt

我有一个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)

2 个答案:

答案 0 :(得分:1)

当您具有与流文件

相关联的 test 属性时
  • 尝试使用 ReplaceText 处理器而不是JoltTransformJson

替换文本配置:

搜索值

}

替换价值

,"interest": ${test}}

字符集 UTF-8 最大缓冲区大小

1 MB

替换策略

Literal Replace

评估模式

Entire text

enter image description here 输入:

{"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