You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

API.Attributes.source.get返回null:如何获取API中的支付类型?

问题:API获取支付类型时返回Null的解决方法

调用API获取支付状态时正常,但获取支付类型时出现API.Attributes.source.get返回null的问题,无法正确拿到支付类型。

当前获取支付类型的代码

Root model = JsonConvert.DeserializeObject<Root>(response.Content);
string paymentType = model.data.attributes.source.type;

期望的响应片段

"source": {
     "id": "src_5LVgh5SpdcgdGuJn1sweL9YeFP9XZ",
     "type": "gcash"
}

API返回的完整响应

{"data": {"id": "link_tov7i3iR5U9wZfwoMSaHY8H6","type": "link","attributes": {"amount": 350000,"archived": false,"currency": "PHP","description": "JUAN DELA CRUZ - 221222011659","livemode": false,"fee": 8750,"remarks": "Delivery Date: Dec. 31, 2022","status": "paid","tax_amount": null,"taxes": [],"checkout_url": "-","reference_number": "ikPzIi2","created_at": 1671643021,"updated_at": 1671643021,"payments": [{"data": {"id": "-","type": "payment","attributes": {"access_url": null,"amount": 350000,"balance_transaction_id": "-","billing": {"address": {"city": "Taguig","country": "PH","line1": "12th floor The Trade and Financial Tower u1206","line2": "32nd street and 7th Avenue","postal_code": "1630","state": "Bonifacio Global City"},"email": "-","name": "-","phone": "-"},"currency": "PHP","description": "- - -","disputed": false,"external_reference_number": "ikPzIi2","fee": 8750,"livemode": false,"net_amount": 341250,"origin": "links","payment_intent_id": null,"payout": null,"source": {"id": "-","type": "gcash"},"statement_descriptor": "Vapers Creed (Cavite, PH)","status": "paid","tax_amount": null,"metadata": {"pm_reference_number": "ikPzIi2"},"refunds": [],"taxes": [],"available_at": 1672045200,"created_at": 1671695870,"paid_at": 1671695870,"updated_at": 1671695870}}}]}}}

对应的C#实体类代码

public partial class Address
{
    [JsonProperty("city")]
    public string city { get; set; }

    [JsonProperty("country")]
    public string country { get; set; }

    [JsonProperty("line1")]
    public string line1 { get; set; }

    [JsonProperty("line2")]
    public string line2 { get; set; }

    [JsonProperty("postal_code")]
    public string postal_code { get; set; }

    [JsonProperty("state")]
    public string state { get; set; }
}

public partial class Attributes
{
    [JsonProperty("amount")]
    public int? amount { get; set; }

    [JsonProperty("archived")]
    public bool? archived { get; set; }

    [JsonProperty("currency")]
    public string currency { get; set; }

    [JsonProperty("description")]
    public string description { get; set; }

    [JsonProperty("livemode")]
    public bool? livemode { get; set; }

    [JsonProperty("fee")]
    public int? fee { get; set; }

    [JsonProperty("remarks")]
    public string remarks { get; set; }

    [JsonProperty("status")]
    public string status { get; set; }

    [JsonProperty("tax_amount")]
    public object tax_amount { get; set; }

    [JsonProperty("taxes")]
    public List<object> taxes { get; set; }

    [JsonProperty("checkout_url")]
    public string checkout_url { get; set; }

    [JsonProperty("reference_number")]
    public string reference_number { get; set; }

    [JsonProperty("created_at")]
    public int? created_at { get; set; }

    [JsonProperty("updated_at")]
    public int? updated_at { get; set; }

    [JsonProperty("payments")]
    public List<Payment> payments { get; set; }

    [JsonProperty("access_url")]
    public object access_url { get; set; }

    [JsonProperty("balance_transaction_id")]
    public string balance_transaction_id { get; set; }

    [JsonProperty("billing")]
    public Billing billing { get; set; }

    [JsonProperty("disputed")]
    public bool? disputed { get; set; }

    [JsonProperty("external_reference_number")]
    public string external_reference_number { get; set; }

    [JsonProperty("net_amount")]
    public int? net_amount { get; set; }

    [JsonProperty("origin")]
    public string origin { get; set; }

    [JsonProperty("payment_intent_id")]
    public object payment_intent_id { get; set; }

    [JsonProperty("payout")]
    public object payout { get; set; }

    [JsonProperty("source")]
    public Source source { get; set; }

    [JsonProperty("statement_descriptor")]
    public string statement_descriptor { get; set; }

    [JsonProperty("metadata")]
    public Metadata metadata { get; set; }

    [JsonProperty("refunds")]
    public List<object> refunds { get; set; }

    [JsonProperty("available_at")]
    public int? available_at { get; set; }

    [JsonProperty("paid_at")]
    public int? paid_at { get; set; }
}

public partial class Billing
{
    [JsonProperty("address")]
    public Address address { get; set; }

    [JsonProperty("email")]
    public string email { get; set; }

    [JsonProperty("name")]
    public string name { get; set; }

    [JsonProperty("phone")]
    public string phone { get; set; }
}

public partial class Data
{
    [JsonProperty("id")]
    public string id { get; set; }

    [JsonProperty("type")]
    public string type { get; set; }

    [JsonProperty("attributes")]
    public Attributes attributes { get; set; }
}

public partial class Metadata
{
    [JsonProperty("pm_reference_number")]
    public string pm_reference_number { get; set; }
}

public partial class Payment
{
    [JsonProperty("data")]
    public Data data { get; set; }
}

public partial class Root
{
    [JsonProperty("data")]
     public Data data { get; set; }
}

public partial class Source
{
    [JsonProperty("id")]
    public string id { get; set; }

    [JsonProperty("type")]
    public string type { get; set; }
}

问题原因与解决方案

问题原因

你当前的代码访问的是model.data.attributes.source,但从API返回的JSON结构来看,source字段并不在根层级的data.attributes下,而是嵌套在data.attributes.payments[0].data.attributes中,所以直接访问根attributes的source会返回null。

修正后的代码

Root model = JsonConvert.DeserializeObject<Root>(response.Content);
string paymentType = null;

// 增加空值检查,避免空引用异常
if (model?.data?.attributes?.payments != null && model.data.attributes.payments.Count > 0)
{
    var firstPayment = model.data.attributes.payments[0];
    paymentType = firstPayment.data.attributes.source?.type;
}

这段代码会先检查payments数组是否存在且有数据,然后访问第一个支付记录里的source.type,即可正确获取支付类型。

内容的提问来源于stack exchange,提问作者John Carlo Diaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 03:55:15