使用ApacheNIFI或Python脚本迭代Json数组
我有一个Json和一个数组字段,我想迭代数组,并为数组中包含的每个属性将其拆分为新行或对象 我目前正在使用ApacheNIFI,但我也可以使用python脚本 我的输入数据是:使用ApacheNIFI或Python脚本迭代Json数组,python,arrays,json,apache-nifi,Python,Arrays,Json,Apache Nifi,我有一个Json和一个数组字段,我想迭代数组,并为数组中包含的每个属性将其拆分为新行或对象 我目前正在使用ApacheNIFI,但我也可以使用python脚本 我的输入数据是: { "workorder_id" : "99999", "properties" : [ { "id" : "11", "propertyType" : { &quo
{
"workorder_id" : "99999",
"properties" : [ {
"id" : "11",
"propertyType" : {
"id" : "55834595398",
"name" : "action"
},
"stringValue" : "string01",
"nodeValue" : null
}, {
"id" : "22",
"propertyType" : {
"id" : "55834595419",
"name" : "Tipo"
},
"stringValue" : "string02",
"nodeValue" : null
}, {
"id" : "33",
"propertyType" : {
"id" : "44",
"name" : "Action2"
},
"stringValue" : "string02",
"nodeValue" : null
}, {
"id" : "55",
"propertyType" : {
"id" : "55834595400",
"name" : "Action3"
}
]
}
输出可以是Json或csv格式。例如,在csv中:
使用与密钥相同的workorder_id
workorder_id,id_properties,stringValue_properties
99999,11,string01
99999,22,string02
99999,33,string03
.
.
.
感谢您的帮助您需要将这些空值转换为None或其他Python类型
# -*- coding: utf-8 -*-
data = {
"workorder_id" : "99999",
"properties" : [
{
"id" : "11",
"propertyType" : {
"id" : "55834595398",
"name" : "action"
},
"stringValue" : "string01",
"nodeValue" : float('nan')
},
{
"id" : "22",
"propertyType" : {
"id" : "55834595419",
"name" : "Tipo"
},
"stringValue" : "string02",
"nodeValue" : float('nan')
},
{
"id" : "33",
"propertyType" : {
"id" : "44",
"name" : "Action2"
},
"stringValue" : "string03",
"nodeValue" : float('nan')
},
{
"id" : "55",
"propertyType" : {
"id" : "55834595400",
"name" : "Action3"
},
"stringValue" : "string04",
"nodeValue" : float('nan')
}
]
}
for item in data['properties']:
print(data['workorder_id'], item['id'], item['propertyType']['id'], item['propertyType']['name'], item['stringValue'], item['nodeValue'])
#99999 11 55834595398 action string01 nan
#99999 22 55834595419 Tipo string02 nan
#99999 33 44 Action2 string03 nan
#99999 55 55834595400 Action3 string04 nan
假设您将空值切换为无
data={'workorder\u id':'99999','property':[{'id':'11','propertyType':{'id':'55834595398','name':'action'},'stringValue':'string01','nodeValue':None},{'id':'22','propertyType':{'id':'55834595419','name':'Tipo stringValue':'string02','nodeValue':None}
def\u处理程序(前置:str,记录:dict):
“”“使用带前缀的字符串重新标记键”“”
d={}
对于记录中的键。键():
新的\u键=“%s\u%s%”(前置,键)
d、 更新({new_key:record[key]})
返回d
def映射器(数据:dict):
“”“返回字典列表。”“”
记录=[]
属性=数据['properties']
对于prop-in属性:
_记录={'workorder\u id':数据['workorder\u id'],}
对于道具键()中的道具键:
prop_data={}
值=道具[道具键]
如果isinstance(值,dict):
属性数据更新(\u处理程序(属性键,值))
其他:
prop_data.update({prop_key:value})
_记录。更新(_handler('property',prop_data))
记录。追加(_记录)
退货记录
输出
[{'workorder_id': '99999',
'property_id': '11',
'property_propertyType_id': '55834595398',
'property_propertyType_name': 'action',
'property_stringValue': 'string01',
'property_nodeValue': None},
{'workorder_id': '99999',
'property_id': '22',
'property_propertyType_id': '55834595419',
'property_propertyType_name': 'Tipo',
'property_stringValue': 'string02',
'property_nodeValue': None}]
您需要将这些空值转换为None或其他Python类型 假设您将空值切换为无
data={'workorder\u id':'99999','property':[{'id':'11','propertyType':{'id':'55834595398','name':'action'},'stringValue':'string01','nodeValue':None},{'id':'22','propertyType':{'id':'55834595419','name':'Tipo stringValue':'string02','nodeValue':None}
def\u处理程序(前置:str,记录:dict):
“”“使用带前缀的字符串重新标记键”“”
d={}
对于记录中的键。键():
新的\u键=“%s\u%s%”(前置,键)
d、 更新({new_key:record[key]})
返回d
def映射器(数据:dict):
“”“返回字典列表。”“”
记录=[]
属性=数据['properties']
对于prop-in属性:
_记录={'workorder\u id':数据['workorder\u id'],}
对于道具键()中的道具键:
prop_data={}
值=道具[道具键]
如果isinstance(值,dict):
属性数据更新(\u处理程序(属性键,值))
其他:
prop_data.update({prop_key:value})
_记录。更新(_handler('property',prop_data))
记录。追加(_记录)
退货记录
输出
[{'workorder_id': '99999',
'property_id': '11',
'property_propertyType_id': '55834595398',
'property_propertyType_name': 'action',
'property_stringValue': 'string01',
'property_nodeValue': None},
{'workorder_id': '99999',
'property_id': '22',
'property_propertyType_id': '55834595419',
'property_propertyType_name': 'Tipo',
'property_stringValue': 'string02',
'property_nodeValue': None}]
使用NiFi
按此顺序:
$.workorder\u id
)评估JsonPath创建属性
$.properties.*
id = $.id
propertyType_id = $.propertyType.id
propertyType_name = $.propertyType.name
workorder_id,id,propertyType_id,propertyType_name
$.workorder\u id
)评估JsonPath创建属性
$.properties.*
id = $.id
propertyType_id = $.propertyType.id
propertyType_name = $.propertyType.name
workorder_id,id,propertyType_id,propertyType_name
感谢您的指导,我使用了EvaluateJsonPath->SplitJson->QueryRecord->ConvertJSONtoSql,这实际上是一种更干净的方法!我不想深入研究记录解析器,因为这是一个更困难的主题-但这是最佳的方法,因为拆分将folws放入mem中,并且记录解析器不需要指南,我使用了EvaluateJsonPath->SplitJson->QueryRecord->ConvertJSONtoSql,这实际上是一种更干净的方法!我不想深入研究记录解析器,因为这是一个更困难的主题——但这是最佳的方法,因为split将FOLs放在mem中,而记录解析器不这样做