当对Web API发出POST请求时,可以通过两种方式返回响应:
{
"Response": {
"StatusCode": 200,
"StatusMessage": "OK",
"Content": {
"auth_hash": "606ca0e7802a070531b4b2fd8ee5fc17b4649a19"
}
}
}
或
{
"Response": {
"StatusCode": 200,
"StatusMessage": "OK",
"Content": {
"document": {
"loja": 5,
"numero": 85099,
"doc": "FS",
"data": "2017-12-13",
"cliente": 0,
"nome": "CONSUMIDOR FINAL",
"liquido": 1.1504,
"total": 1.3,
"anulado": 0,
"emp": 5,
"pago": 1,
"datapag": "2017-12-13",
"tipo": 0,
"pagamento": 1,
"datahora": "2017-12-13 12:51:51",
"deve": 0,
"idcx": 240403,
"mesa": 1001,
"mesaidx": 0,
"lugar": 0
}
}
}
}
如何反序化价值"内容"进入一个C#类对象是这个值变量吗?
最好的问候
答案 0 :(得分:3)
我假设您知道哪个调用可以返回哪个响应。然后解决方案可以是创建一个通用容器,并提供期望的类型作为泛型参数。所以容器看起来像这样:
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; }
}
然后,您为每个响应类型创建(或更确切地说,generate)一个类:
public class DocumentContent
{
public Document document { get; set; }
}
public class Document
{
public int loja { get; set; }
// ...
public int lugar { get; set; }
}
然后你可以通过改变TContent
参数来反序列化你想要的类型,在这种情况下DocumentContent
:
string json = PerformDocumentCall();
var deserialized = JsonConvert.DeserializeObject<ResponseContainer<DocumentContent>>(json);
对于身份验证回复,您传递了AuthContent
:
public class AuthContent
{
public string auth_hash { get; set; }
}
string json = PerformAuthCall();
var deserialized = JsonConvert.DeserializeObject<ResponseContainer<AuthContent>>(json);
答案 1 :(得分:0)
除了读取和解析原始字符串并寻找线索之外,一种非常简单的方法是首先简单地反序列化为一个POCO(使用Json.NET或类似)。如果所有值都为空,则尝试下一个类型。您反序列化的顺序可以从特定用例中最常见或预期的顺序决定。
或者,如果您觉得有点冒险,可以将其反序列化为Project Structure > Modules
,然后检查dynamic
是否存在。代码非常少,但不像上面那样“严格”。