如何在 Invoice 自定义报告中仅获取 Payment amount
支付老李
结论
如果返回值是 JSON 字符串,需要先用 json.loads() 转换成 Python 字典,再读取 content 列表中第一条记录的 amount:
import json
data = json.loads(json_value)
amount = data['content'][0]['amount']
在示例数据中,amount 的值是:
500.0
数据结构
返回的数据结构可以简化为:
{
"content": [
{
"amount": 500.0
}
]
}
最外层是字典,content 是列表,[0] 取出列表中的第一条付款记录,['amount'] 则读取这条记录的付款金额。
完整代码如下:
import json
json_value = '''
{
"title": "Less Payment",
"outstanding": false,
"content": [
{
"name": "Customer Payment: INV/2021/0006",
"journal_name": "Bank",
"amount": 500.0,
"currency": "$"
}
]
}
'''
data = json.loads(json_value)
amount = data['content'][0]['amount']
print(amount)
输出结果:
500.0
在报告代码中安全读取
如果 content 可能为空,直接访问 [0] 会触发 IndexError。可以先检查列表是否有数据:
import json
data = json.loads(json_value)
content = data.get('content') or []
amount = content[0].get('amount', 0.0) if content else 0.0
如果返回值有时是 JSON 字符串,有时已经是 Python 字典,可以兼容这两种情况:
import json
data = json.loads(json_value) if isinstance(json_value, str) else json_value
content = data.get('content') or []
amount = content[0].get('amount', 0.0) if content else 0.0
存在多条付款记录时
由于 content 是列表,一张发票可能有多条付款记录。使用 [0] 只能读取第一笔付款的金额。
获取所有付款金额:
amounts = [
item.get('amount', 0.0)
for item in data.get('content', [])
]
计算付款总额:
total_amount = sum(
item.get('amount', 0.0)
for item in data.get('content', [])
)
具体读取第一笔金额、所有金额还是付款总额,要根据报表需求决定。金额还可能受币种和舍入规则影响。如果报表包含多种币种,不能在转换币种前直接汇总。
备注:内容仅供参考。
