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
相关产品推荐
相关产品推荐

