C# - 使用值thas反序列化Json对象具有可变内容

时间:2017-12-13 13:08:38

标签: c# json class deserialization

当对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#类对象是这个值变量吗?

最好的问候

2 个答案:

答案 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是否存在。代码非常少,但不像上面那样“严格”。