C#JSON反序列化字典<string,dictionary <string,=“”string =“”>&gt;可选的?

时间:2017-09-14 14:52:36

标签: c# json asp.net-web-api deserialization

我的有效载荷看起来像这样:

{
    "REFERENCE": "1",
    "FIELDS" : {
        "CUST" : "1234",
        "PROD" : "PR2134",
        "LIMIT" : "12345",
        "LINES" : {
              "LINE" : "01",
              "DATA" : "12"
        }
    }
}

我的对象只有以下内容:

public class TriggerRequest
{
    public string reference { get; set; }
    public Dictionary<string, string> fields { get; set; }

}

显然,这并不能处理LINES对象。如何创建一个反序列化入站有效负载的类,其中LINES之类的东西是动态的(即我可以在任何字典中发送&gt;在有效负载的任何一点,并且它可以正确地反序列化。这是我需要创建的时候自定义JsonConverter?

2 个答案:

答案 0 :(得分:2)

您可以改用dynamic

public class TriggerRequest
{
    public string reference { get; set; }
    public dynamic fields { get; set; }
}

这应该允许您直接在代码中访问(string)request.fields.lines.data

但是,如果您在编译时不知道其中包含哪些值,您可能更愿意将字段设为JObject

public class TriggerRequest
{
    public string reference { get; set; }
    public JObject fields { get; set; }
}

这使您有机会编写代码,检查每个属性中的数据类型并做出相应的响应。

最后,如果您 知道您希望fields拥有哪些属性,请为其创建一个单独的类。

public class TriggerRequest
{
    public string reference { get; set; }
    public TriggerRequestFields fields { get; set; }
}

public class TriggerRequestFields
{
    public string cust {get;set;}
    ...
    public TriggerRequestLines lines {get;set;}
}

public class TriggerRequestLines
{
    public string line {get;set;}
    public string data {get;set;}
}

答案 1 :(得分:0)

尝试更改

public Dictionary<string, dynamic> fields { get; set; }

使用

public Dictionary<string, object> fields { get; set; }