Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-使用值thas has has variable content反序列化Json对象_C#_Json_Class_Deserialization - Fatal编程技术网

C#-使用值thas has has variable content反序列化Json对象

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对象中 最好的祝愿除了读取和解析原始字符串并寻

当向web API发送POST请求时,可以通过两种方式返回响应:

{
"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);