如何处理 API 有时将属性作为数组返回,有时作为对象返回?
Posted
技术标签:
【中文标题】如何处理 API 有时将属性作为数组返回,有时作为对象返回?【英文标题】:How to deal with API sometimes returning a property as an array and sometimes as an object? 【发布时间】:2022-01-04 15:36:33 【问题描述】:谁能看到这里的问题?对象“OrderItemPayment”在反序列化过程中由于某种原因变成了一个数组?
当我尝试反序列化如下所示的响应时:
我得到这个结果:
"items":[
"created_at":"2021-01-28 18:37:45",
"payment":[
]
,
"created_at":"2021-01-28 16:06:23",
"payment":[
]
]
我的课程
[Serializable]
public class Order
[JsonProperty("items")]
public OrderItem[]? Items get; set;
[Serializable]
public class OrderItem
[JsonProperty("created_at")]
public string? CreatedAt get; set;
[JsonProperty("payment")]
public OrderItemPayment Payment get; set; = new OrderItemPayment();
[Serializable]
public record OrderItemPayment
[JsonProperty("amount_paid")]
public decimal AmountPaid get; set;
[JsonProperty("shipping_captured")]
public decimal ShippingCaptured get; set;
我的结果:
【问题讨论】:
初始屏幕截图和模型中的付款是单个对象。在您显示的结果 (response.Content
) 中,它是一个数组。
@Llama 是的,这是我的问题。由于支付是一个对象,它应该解析为一个对象而不是一个数组,但我不明白为什么。
那么您的问题真的是“”
@Llama 这是一个更好的标题,是的,这真的是我的问题。
【参考方案1】:
根据屏幕截图,您必须修复您的 OrderItem
public partial class OrderItem
[JsonProperty("created_at")]
public string? CreatedAt get; set;
[JsonProperty("payment")]
public List<OrderItemPayment> Payment get; set;
根据您的屏幕截图,付款应反序列化为 []
【讨论】:
邮递员的响应显示支付是一个对象并包含诸如 amount_paid 之类的数据。但是当我尝试从 restsharp 客户端获取数据并根据我的模型反序列化时,OrderItemPayment 对象转换为出于某种原因的数组。 @Hannes Response 不会将数据转换为任何内容。它只是显示一个真实的 json 对象。 我只是更改了标题,以便更容易理解我的问题。 @Hannes 问题是 API 而不是客户端序列化。 API 未返回付款数据。以上是关于如何处理 API 有时将属性作为数组返回,有时作为对象返回?的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot @JsonIgnore 在实体上,有时我希望将属性作为 Json 返回