Python 逐行浏览json,包括未知的嵌套数组和对象
我有一个JSON字典,可以由未知对象和数组组成,但我知道需要修改哪些键 我的代码将遍历JSON文件,如果它有某些键,比如“Date”,它将执行其他任务 该代码适用于外部键,但如果存在名为“Date”的嵌套键,则将跳过它 我需要密码逐行检查所有的钥匙 代码如下Python 逐行浏览json,包括未知的嵌套数组和对象,python,dictionary,Python,Dictionary,我有一个JSON字典,可以由未知对象和数组组成,但我知道需要修改哪些键 我的代码将遍历JSON文件,如果它有某些键,比如“Date”,它将执行其他任务 该代码适用于外部键,但如果存在名为“Date”的嵌套键,则将跳过它 我需要密码逐行检查所有的钥匙 代码如下 def Converttimestamp(x): format = '%Y-%m-%dT%H:%M:%S.%f' print(x) for e in x: print(e) for
def Converttimestamp(x):
format = '%Y-%m-%dT%H:%M:%S.%f'
print(x)
for e in x:
print(e)
for column in ['JournalDate','CreatedDateUTC','UpdatedDateUTC','Date','DueDate','DeliveryDate','ExpectedArrivalDate','DateUTC']:
if column in e:
ts = e[column]
print ("\n" + str(ts) + "\n")
ts_utc = re.split('\(|\)', ts)[1]
ts_utc = ts_utc[:ts_utc.find("+")]
e[column] = datetime.fromtimestamp(float(ts_utc)/1000).strftime(format)
print(str(e[column]))
return(e)
JSON口述:
x = {
"InvoiceID": "8930",
"InvoiceNumber": "Inv. 1",
"Reference": "",
"Payments": [
{
"PaymentID": "538",
"Date": "/Date(1406246400000+0000)/",
"Amount": 118.0,
"Reference": "",
"CurrencyRate": 1.0,
"HasAccount": false,
"HasValidationErrors": false
}
],
"AmountDue": 0.0,
"AmountPaid": 118.0,
"AmountCredited": 0.0,
"CurrencyRate": 1.0,
"Date": "/Date(1406246400000+0000)/",
"DueDate": "/Date(1406246400000+0000)/"
"UpdatedDateUTC": "/Date(1406246400000+0000)/"
}
结果JSON字典:
{
"InvoiceID": "8930",
"InvoiceNumber": "Inv. 1",
"Reference": "",
"Payments": [
{
"PaymentID": "538",
"Date": "/Date(1406246400000+0000)/",
"Amount": 118.0,
"Reference": "",
"CurrencyRate": 1.0,
"HasAccount": false,
"HasValidationErrors": false
}
],
"AmountDue": 0.0,
"AmountPaid": 118.0,
"AmountCredited": 0.0,
"CurrencyRate": 1.0,
"Date": "2014-06-30T02:00:00.000000",
"DueDate": "2014-06-30T02:00:00.000000"
"UpdatedDateUTC": "2014-12-15T14:08:51.843000"
}
在日期
在列表中
键中,因此必须通过访问列表中的字典来提取日期支付
data=[{'AmountCredited':0.0,
“到期金额”:0.0,
“支付金额”:118.0,
“CurrencyRate”:1.0,
“日期”:“日期(1206246400000+0000)/”,
“DueDate”:日期(1306246400000+0000)/,
“发票ID”:“8930”,
“发票编号”:“1号存货”,
“付款”:[{“金额”:118.0,
“CurrencyRate”:1.0,
“日期”:“日期(1406246400000+0000)/”,
“HasAccount”:错误,
“HasValidationErrors”:False,
“PaymentID”:“538”,
'参考':'',
'TestDate':'failtest in'},
{'Amount':118.0,
“CurrencyRate”:1.0,
“日期”:“日期(1506246400000+0000)/”,
“HasAccount”:错误,
“HasValidationErrors”:False,
“PaymentID”:“538”,
'参考':'',
'TestDate':'failtest in'}],
'参考':'',
'测试日期':'失败测试',
'UpdateDateUTC':'/Date(1606246400000+0000)/',
{'amount':0.0,
“到期金额”:0.0,
“支付金额”:118.0,
“CurrencyRate”:1.0,
“日期”:“日期(1206246400000+0000)/”,
“DueDate”:日期(1306246400000+0000)/,
“发票ID”:“8930”,
“发票编号”:“1号存货”,
“付款”:[{“金额”:118.0,
“CurrencyRate”:1.0,
“日期”:“日期(1406246400000+0000)/”,
“HasAccount”:错误,
“HasValidationErrors”:False,
“PaymentID”:“538”,
'参考':'',
'TestDate':'failtest in'},
{'Amount':118.0,
“CurrencyRate”:1.0,
“日期”:“日期(1506246400000+0000)/”,
“HasAccount”:错误,
“HasValidationErrors”:False,
“PaymentID”:“538”,
'参考':'',
'TestDate':'failtest in'}],
'参考':'',
'测试日期':'失败测试',
'UpdateDateUTC':'/Date(1606246400000+0000)/']
代码
从日期时间导入日期时间
def至_iso(ts):
格式=“%Y-%m-%dT%H:%m:%S.%f”
尝试:
ts_utc=re.findall('\d+',ts)[0]
return datetime.fromtimestamp(float(ts_utc)/1000).strftime(格式)
除了(索引器、类型错误):
打印(带有“Date”的f'A键,但无法转换值:{ts})
返回ts
def convert_时间戳(我的目录列表:列表):
对于我的字典列表中的e:
#检查值不是列表的顶级键
带有日期的按键=[k代表k,e中的v.items()如果k中的'date'为'date',则键入(v)!=list]
对于带有日期的钥匙中的k1:
e[k1]=to_iso(e[k1])
#检查值为列表的顶级键
带_列表的键_=[k代表k,e.items()中的v如果类型(v)=list]
对于键中的k1和键列表:
对于枚举(e[k1])中的i,d:
对于k2,v在d.项()中:
如果k2中的“日期”:
e[k1][i][k2]=to_iso(d[k2])
返回我的目录列表
使用和输出
test=convert\u时间戳(数据)
带有“日期”的键,但无法转换值:failtest out
带有“日期”的键,但无法转换值:failtest in
带有“Date”的键,但无法转换值:failtest in
带有“日期”的键,但无法转换值:failtest out
带有“日期”的键,但无法转换值:failtest in
带有“Date”的键,但无法转换值:failtest in
打印(测试)
[{'Amount':0.0,
“到期金额”:0.0,
“支付金额”:118.0,
“CurrencyRate”:1.0,
“日期”:“2008-03-22T21:26:40.000000”,
“截止日期”:2011-05-24T07:13:20.000000,
“发票ID”:“8930”,
“发票编号”:“1号存货”,
“付款”:[{“金额”:118.0,
“CurrencyRate”:1.0,
“日期”:“2014-07-24T17:00:00.000000”,
“HasAccount”:错误,
“HasValidationErrors”:False,
“PaymentID”:“538”,
'参考':'',
'TestDate':'failtest in'},
{'Amount':118.0,
“CurrencyRate”:1.0,
“日期”:2017-09-24T02:46:40.000000,
“HasAccount”:错误,
“HasValidationErrors”:False,
“PaymentID”:“538”,
'参考':'',
'TestDate':'failtest in'}],
'参考':'',
'测试日期':'失败测试',
'UpdateDateUTC':'2020-11-24T11:33:20.000000'},
{'amount':0.0,
“到期金额”:0.0,
“支付金额”:118.0,
“CurrencyRate”:1.0,
“日期”:“2008-03-22T21:26:40.000000”,
“截止日期”:2011-05-24T07:13:20.000000,
“发票ID”:“8930”,
“发票编号”:“1号存货”,
“付款”:[{“金额”:118.0,
“CurrencyRate”:1.0,
“日期”:“2014-07-24T17:00:00.000000”,
“HasAccount”:错误,
“HasValidationErrors”:False,
“PaymentID”:“538”,