C#-使用值thas has has variable content反序列化Json对象
当向web API发送POST请求时,可以通过两种方式返回响应:C#-使用值thas has has variable content反序列化Json对象,c#,json,class,deserialization,C#,Json,Class,Deserialization,当向web API发送POST请求时,可以通过两种方式返回响应: { "Response": { "StatusCode": 200, "StatusMessage": "OK", "Content": { "auth_hash": "606ca0e7802a070531b4b2fd8ee5fc17b4649a19" } } } 或 如何将值“Content”反序列化到作为该值变量的C#class对象中 最好的祝愿除了读取和解析原始字符串并寻
{
"Response": {
"StatusCode": 200,
"StatusMessage": "OK",
"Content": {
"auth_hash": "606ca0e7802a070531b4b2fd8ee5fc17b4649a19"
}
}
}
或
如何将值“Content”反序列化到作为该值变量的C#class对象中
最好的祝愿除了读取和解析原始字符串并寻找线索之外,一种非常简单的方法是首先将其反序列化为一个POCO(使用或类似方法)。如果所有值都为空,请尝试下一种类型。反序列化的顺序可以根据特定用例中最常见的或预期的内容来确定
或者,如果您觉得有点冒险,您可以将其反序列化为
动态
,只需检查响应.Content.document
是否存在。代码很少,但不像上面那样“严格”。我假设您知道哪个调用可以返回哪个响应。然后,一个解决方案可以是创建一个泛型容器,并提供预期的类型作为泛型参数。因此,容器如下所示:
public class ResponseContainer<TContent>
{
public Response<TContent> Response { get; set; }
}
public class Response<TContent>
{
public int StatusCode { get; set; }
public string StatusMessage { get; set; }
public TContent Content { get; set; }
}
然后,您可以通过改变TContent
参数反序列化为所需的类型,在本例中为DocumentContent
:
string json = PerformDocumentCall();
var deserialized = JsonConvert.DeserializeObject<ResponseContainer<DocumentContent>>(json);
public class AuthContent
{
public string auth_hash { get; set; }
}
string json = PerformAuthCall();
var deserialized = JsonConvert.DeserializeObject<ResponseContainer<AuthContent>>(json);
调用API时,您知道
Content
节点中会有什么吗?这是两个不同的响应,您需要两个不同的内容类来澄清-这两个响应来自完全相同的调用?正如调用api/route1
可以返回这些响应中的任何一个一样?请查看@CodeCaster-在这种情况下,他必须创建包含两个响应属性的内容类。如果有五种可能的返回类型,该怎么办?执行五个反序列化调用,每个调用具有不同的类型,并检查某些属性是否为null?反正不是我的否决票。可能有无限的返回类型,但这当然是低效的。除非您正在调用的API可以告诉您期望的类型(或者可以从上下文中推断出来,等等),否则不管发生什么情况,您最终都会进行一些检查。拉屎=>拉屎。不管是谁投了反对票,我都很乐意接受他的解释。我的答案是正确的,并且会起作用。他是如何知道他将收到回复1或回复2的。这让我很困惑…如果他知道我的答案中的一句话,你可能是对的。我想他们是这样做的。@PranayRana我想这是假设你知道自己在做什么调用——这是使用API时的常见状态。如果一个电话返回两个完全不同的(成功/200)响应,那就太奇怪了。我同意你的看法。这样看起来更好。如果响应是动态的,那可能会有问题。这就是it@PranayRana此时,您要求api作者返回合理的响应,或者使用不同的响应。
string json = PerformDocumentCall();
var deserialized = JsonConvert.DeserializeObject<ResponseContainer<DocumentContent>>(json);
public class AuthContent
{
public string auth_hash { get; set; }
}
string json = PerformAuthCall();
var deserialized = JsonConvert.DeserializeObject<ResponseContainer<AuthContent>>(json);