Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ApacheNIFI或Python脚本迭代Json数组_Python_Arrays_Json_Apache Nifi - Fatal编程技术网

使用ApacheNIFI或Python脚本迭代Json数组

使用ApacheNIFI或Python脚本迭代Json数组,python,arrays,json,apache-nifi,Python,Arrays,Json,Apache Nifi,我有一个Json和一个数组字段,我想迭代数组,并为数组中包含的每个属性将其拆分为新行或对象 我目前正在使用ApacheNIFI,但我也可以使用python脚本 我的输入数据是: { "workorder_id" : "99999", "properties" : [ { "id" : "11", "propertyType" : { &quo

我有一个Json和一个数组字段,我想迭代数组,并为数组中包含的每个属性将其拆分为新行或对象

我目前正在使用ApacheNIFI,但我也可以使用python脚本

我的输入数据是:

{
  "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(
    $.workorder\u id
    )评估JsonPath创建属性

  • 输出将其发送到
    $.properties.*

  • splitjson的输出将其发送到evaluatejson,您将在那里提取数组

    id = $.id
    propertyType_id = $.propertyType.id
    propertyType_name = $.propertyType.name
    
  • 现在,您的每个流都将具有以下属性:

    workorder_id,id,propertyType_id,propertyType_name
    
  • 使用此列表使用AttributestoCSV

    工单id、id、属性类型id、属性类型名称

  • 合并内容

  • putfile(保存您的csv)

  • 使用NiFi

    按此顺序:

  • 从workorder\u id(
    $.workorder\u id
    )评估JsonPath创建属性

  • 输出将其发送到
    $.properties.*

  • splitjson的输出将其发送到evaluatejson,您将在那里提取数组

    id = $.id
    propertyType_id = $.propertyType.id
    propertyType_name = $.propertyType.name
    
  • 现在,您的每个流都将具有以下属性:

    workorder_id,id,propertyType_id,propertyType_name
    
  • 使用此列表使用AttributestoCSV

    工单id、id、属性类型id、属性类型名称

  • 合并内容

  • putfile(保存您的csv)


  • 感谢您的指导,我使用了EvaluateJsonPath->SplitJson->QueryRecord->ConvertJSONtoSql,这实际上是一种更干净的方法!我不想深入研究记录解析器,因为这是一个更困难的主题-但这是最佳的方法,因为拆分将folws放入mem中,并且记录解析器不需要指南,我使用了EvaluateJsonPath->SplitJson->QueryRecord->ConvertJSONtoSql,这实际上是一种更干净的方法!我不想深入研究记录解析器,因为这是一个更困难的主题——但这是最佳的方法,因为split将FOLs放在mem中,而记录解析器不这样做