如何处理 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 有时将属性作为数组返回,有时作为对象返回?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理以数组作为返回值的 go RPC 调用?

Spring Boot @JsonIgnore 在实体上,有时我希望将属性作为 Json 返回

改造2如何处理有时无效有时非无效的服务器响应

PHP如何处理一个引用自身作为元素的数组?

如何处理 PHP 代码中的 HTTP/1.1 403 Forbidden

如何处理来自 API 调用的“Unexpected EOF at target”错误?