PAYATHON 2026

如何在 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', [])
)

具体读取第一笔金额、所有金额还是付款总额,要根据报表需求决定。金额还可能受币种和舍入规则影响。如果报表包含多种币种,不能在转换币种前直接汇总。

备注:内容仅供参考。