C# JsonConvert.DeserializeObject对象来自API,使用Webclient可以是两种对象类型之一

C# JsonConvert.DeserializeObject对象来自API,使用Webclient可以是两种对象类型之一,c#,json,object,serialization,dynamic,C#,Json,Object,Serialization,Dynamic,我正在尝试使用C#.Net Core 3.1访问FitBit API 但是,对于睡眠数据,它可以返回SleepJSON对象或具有重试持续时间的元对象 { "meta": { "retryDuration": 3000, "state": "pending" } } 如果我不需要处理这个元对象,我只需要做这个,只要我没有得到另一个 var response=JsonC

我正在尝试使用C#.Net Core 3.1访问FitBit API

但是,对于睡眠数据,它可以返回SleepJSON对象或具有重试持续时间的元对象

{
    "meta": {
        "retryDuration": 3000,
        "state": "pending"
    }
}
如果我不需要处理这个元对象,我只需要做这个,只要我没有得到另一个

var response=JsonConvert.DeserializeObject(wait wc.DownloadStringTaskAsync($“{url}”)

我对API工作还比较陌生,并且尝试过使用dynamic,但是当我试图确定返回的是哪一个,然后将它们转换为要使用的对象类型时,我陷入了困境


我真的不知道如何处理这两种可能的返回对象类型。

当你不知道你得到的是哪种对象时(真正好的API要么避免这种行为,要么使用标题提示你如何读取内容),你可以将响应解析成,检查顶层属性,并根据其存在性选择适当的路径

var json = await wc.DownloadStringTaskAsync($"{url}");

var jObject = JObject.Parse(json);
if (jObject.Property("meta") != null)
{
    // handle meta here
    meta = jObject.ToObject<MetaResponse>();
}
else
{
    // you can fully deserialize the normal path here
    response = jObject.ToObject<SleepJSON>();
}
var json=wait wc.downloadstringtaskancy($“{url}”);
var jObject=jObject.Parse(json);
if(jObject.Property(“meta”)!=null)
{
//在这里处理元
meta=jObject.ToObject();
}
其他的
{
//您可以在此完全反序列化正常路径
response=jObject.ToObject();
}

尝试反序列化它是一种类型。如果失败,试试另一个。如果(jObject.Property(“meta”)!=null){meta=jObject.ToObject();}else,这似乎就是我成功的答案{response=jObject.ToObject();}谢谢@DavidL@bandworthy很高兴为语法松散提供帮助并表示歉意。我已经更新了我的答案,使之更加一致。