NiFi - 将 JSON 字符串转换为有效的 JSON

问题描述 投票:0回答:2

使用 UpdateRecord,我尝试将 json 字符串转换为有效的 json:

输入:

{
  "user" : "{\"id\":\"1\",\"name\":\"TEST\"}"
}

电流输出:

{
  "user":"{id=1, name=TEST}"
}

预期输出:

{
  "user": { 
      "id": "1", 
      "name": "TEST" 
  }
}

我该如何解决这个问题?使用其他处理器或脚本?你能给我建议吗?

问候!

更新记录:

enter image description here

json apache-nifi jolt
2个回答
2
投票

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

1
投票

您可以使用 JoltTransformJSON 处理器( Jolt 转换库旨在将 JSON 转换为另一个 JSON )与规范

[
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "u": "=split('\"', @(1,user))",
      "user": "=join('',@(1,u))"
    }
  },
  {
    "operation": "remove",
    "spec": {
      "u": ""
    }
  }
]

其中使用

split
删除\"部分,然后使用join函数组合字符串的其余部分。额外创建的辅助属性 u 在最后一步中被删除。

enter image description here

编辑:根据您的编辑使用以下转换

[
  {
    "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"
    }
  }
]

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.