使用 UpdateRecord,我尝试将 json 字符串转换为有效的 json:
输入:
{
"user" : "{\"id\":\"1\",\"name\":\"TEST\"}"
}
电流输出:
{
"user":"{id=1, name=TEST}"
}
预期输出:
{
"user": {
"id": "1",
"name": "TEST"
}
}
我该如何解决这个问题?使用其他处理器或脚本?你能给我建议吗?
问候!
更新记录:
UpdateRecord
以这种方式工作,因为它从输入记录推断记录的架构,并标识字符串类型的字段 user。
因此,即使您尝试使用
ScriptedTransformRecord
而不是 UpdateRecord
并尝试使用 Record.setValue(fieldName,convertStringToMap(previousValue))
,这会将地图转换为 String,并且您仍然会获得 String 类型的字段用户。 (setValue()
不会更改已存在字段的类型)
解决方法可能是丰富记录添加一个新字段,例如类型为
user_map
的Map(String,String)
。
ScriptedTransformRecord
创建具有新模式的新记录,例如使用以下 groovy 脚本,其中 JsonSlurper
用于取消转义 Json
import groovy.json.JsonSlurper
import org.apache.nifi.serialization.SimpleRecordSchema
import org.apache.nifi.serialization.record.MapRecord
import org.apache.nifi.serialization.record.Record
def slurper = new JsonSlurper()
Record result = new MapRecord(new SimpleRecordSchema([]),[:]) // empty record
record.toMap().each { k,v ->
result.setValue(k,slurper.parseText(v as String)) // adding a field Map<String,String>
}
return result
您可以使用 JoltTransformJSON 处理器( Jolt 转换库旨在将 JSON 转换为另一个 JSON )与规范
[
{
"operation": "modify-overwrite-beta",
"spec": {
"u": "=split('\"', @(1,user))",
"user": "=join('',@(1,u))"
}
},
{
"operation": "remove",
"spec": {
"u": ""
}
}
]
其中使用
split删除
\"
部分,然后使用join函数组合字符串的其余部分。额外创建的辅助属性 u 在最后一步中被删除。
编辑:根据您的编辑使用以下转换
[
{
"operation": "modify-overwrite-beta",
"spec": {
"user": "=split('\"', @(1,user))",
"id": "@(1,user[3])",
"name": "@(1,user[7])"
}
},
{
"operation": "remove",
"spec": {
"user": ""
}
},
{
"operation": "shift",
"spec": {
"@": "user"
}
}
]