【问题标题】:How to deal with API sometimes returning a property as an array and sometimes as an object?如何处理 API 有时将属性作为数组返回,有时作为对象返回?
【发布时间】: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 是的,这是我的问题。由于支付是一个对象,它应该解析为一个对象而不是一个数组,但我不明白为什么。
  • 那么您的问题真的是“如何处理 API 有时将属性作为数组返回,有时作为对象返回?”
  • @Llama 这是一个更好的标题,是的,这真的是我的问题。

标签: c# json serialization


【解决方案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 未返回付款数据。
猜你喜欢
  • 2012-05-30
  • 2019-04-25
  • 2010-10-13
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 2014-02-20
相关资源
最近更新 更多