C# JsonConvert.DeserializeObject对象来自API,使用Webclient可以是两种对象类型之一
我正在尝试使用C#.Net Core 3.1访问FitBit API 但是,对于睡眠数据,它可以返回SleepJSON对象或具有重试持续时间的元对象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
{
"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很高兴为语法松散提供帮助并表示歉意。我已经更新了我的答案,使之更加一致。