C#类名基于变量

时间:2017-06-27 13:26:58

标签: c#

在我的应用中,我收到了服务器的回复。这些回复可以是:

{
    "cmd":"read_ack",
    "model":"sensor_ht",
    "sid":"158d0001a2ddac",
    "short_id":36192,
    "data":"{\"voltage\":3005,\"temperature\":\"2741\",\"humidity\":\"5828\"}"
}

或者它可以是:

{  
    "cmd":"read_ack",
    "model":"magnet",
    "sid":"158d000159febe",
    "short_id":40805,
    "data":"{\"voltage\":3045,\"status\":\"open\"}"
}

我可以使用“动态”类吗?

我的班级看起来像这样:

    public class RootObject
    {
        public string cmd { get; set; }
        public string model { get; set; }
        public string sid { get; set; }
        public int short_id { get; set; }
        public Data data { get; set; }
    }

我的数据类看起来像:

    public class Data
    {
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public int voltage { get; set; }
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public string status { get; set; }
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public string temperature { get; set; }
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public string humidity { get; set; }
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public string no_close { get; set; }
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public string no_motion { get; set; }
    }

我可以为每种类型的响应设置不同的类吗?是否可以动态更改RootObject类中的数据类型?

非常感谢

1 个答案:

答案 0 :(得分:0)

您需要How to deserialize a JSON property that can be two different data types using Json.NET中所述的自定义转换器,以及用于更改数据类型的继承。

您可以使用更多派生类型实现的空基类来处理它:

public class RootObject
{
    public string cmd { get; set; }
    public string model { get; set; }
    public string sid { get; set; }
    public int short_id { get; set; }
    public SensorData data { get; set; }
}

public abstract class SensorData
{       
}

public class MagnetData : SensorData
{
    public int Voltage { get; set; }
}

public class SomeOtherSensorData : SensorData
{
    public bool AnotherProperty { get; set; }
}

然后在您的转换器中,将反序列化为MagnetDataSomeOtherSensorData或您想要的任何其他类。

也就是说,您实际上想要为每种类型的数据创建一个类。这有利有弊。

或者,只需将您的data反序列化为Dictionary<string, object>,然后按其(字符串)名称提取相关字段。