Json解析类型发生变化的对象

Json解析类型发生变化的对象,json,.net-core,json.net,Json,.net Core,Json.net,我正在编写一个用于使用UptimeRobot API的.Net标准库。我发现了一个端点,它有时返回一个int数组,有时返回一个0 我使用的字段是监视器 { "stat": "ok", "pagination": { "offset": 0, "limit": 50, "total": 2 }, "psps": [ { "id": 2345678, "friendly_name": "Full Status", "

我正在编写一个用于使用UptimeRobot API的.Net标准库。我发现了一个端点,它有时返回一个
int
数组,有时返回一个
0

我使用的字段是
监视器

{
  "stat": "ok",
  "pagination": {
    "offset": 0,
    "limit": 50,
    "total": 2
  },
  "psps": [
    {
      "id": 2345678,
      "friendly_name": "Full Status",
      "monitors": 0,
      "sort": 1,
      "status": 1,
      "standard_url": "https://stats.uptimerobot.com/xxxxxx",
      "custom_url": ""
    },
    {
      "id": 123456,
      "friendly_name": "Filtered Status",
      "monitors": [
        783210435,
        783210481
      ],
      "sort": 1,
      "status": 1,
      "standard_url": "https://stats.uptimerobot.com/xxxxxx",
      "custom_url": ""
    }
  ]
}
这是我的模型:

使用Newtonsoft.Json;
使用System.Collections.Generic;
使用锐化.Common.Types;
使用System.Diagnostics.CodeAnalysis;
命名空间锐化.Common.Models.PublicStatusPages
{
公共类PublicStatusPage
{
[不包括CODECODECOVERAGE]
[JsonProperty(PropertyName=“id”)]
公共int Id{get;set;}
[JsonProperty(PropertyName=“friendly_name”)]
公共字符串名称{get;set;}
[JsonProperty(PropertyName=“monitors”)]
公共列表监视器{get;set;}
[JsonProperty(PropertyName=“sort”)]
公共整数排序{get;set;}
[JsonProperty(PropertyName=“status”)]
PublicPublicStatusPageStatusType状态{get;set;}
[JsonProperty(PropertyName=“标准url”)]
公共字符串标准URL{get;set;}
[JsonProperty(PropertyName=“custom_url”)]
公共字符串CustomURL{get;set;}
}
}
如果我将查询限制为仅包含数组的结果,那么
监视器
对象将进行解析,但如果我尝试引入另一个结果,则会失败


有什么想法吗?我甚至不能100%确定用什么措辞来试图解决这个问题

您可以使用转换器来转换只有一个项目要列出的情况。例如,考虑以下转换器

class SingleOrArrayConverter<T> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(List<T>));
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
if (token.Type == JTokenType.Array)
{
return token.ToObject<List<T>>();
}
return new List<T> { token.ToObject<T>() };
}

public override bool CanWrite
{
get { return false; }
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
这将允许您正确地反序列化Json

样本输出


添加转换器以检查是否返回单个0,并将其添加到列表中,然后返回所有其他内容的默认值。
[JsonConverter(typeof(SingleOrArrayConverter<int>))]
[JsonProperty( PropertyName = "monitors" )]
public List<int> Monitors { get; set; }