将Json转换为两个可能的对象

时间:2015-08-07 21:56:26

标签: c# json

我目前正在以Json格式接收两种不同类型的对象,我需要将这些Json反序列化为相应的对象。但是,我的问题是所有这些对象都是由同一个通道发送的,这意味着当我收到一个对象但我不知道该对象是哪种类型。两种不同类型的对象如下所示。所以我的问题是,是否有一个函数允许我尝试使用一种对象类型进行反序列化,如果失败,我会使用另一种?

//Object1
public class OutputStream
{
    public DateTime summaryId { get; set; }

    public string total { get; set; }

    public int userId { get; set; }

    public string dataType { get; set; }

    public SensorLocation location { get; set; }

    public HeartRateActivityType activityType { get; set; }
}

//Object2
public class OutputStreamAMM
{
    [DataMember]
    public DateTime summaryId { get; set; }

    [DataMember]
    public string average { get; set; }

    [DataMember]
    public string max { get; set; }

    [DataMember]
    public string min { get; set; }

    [DataMember]
    public int userId { get; set; }

    [DataMember]
    public string dataType { get; set; }

    [DataMember]
    public SensorLocation location { get; set; }

    [DataMember]
    public HeartRateActivityType activityType { get; set; }
}

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

您可以为其中一个模型编写Json Schema,然后根据模式验证您的json文档,看它是否匹配。

您可以使用Newtonsoft.Json

var schema = JsonSchema.Parse(...);
var jtoken = JToken.Parse(jsonString);

if(jtoken.IsValid(schema))
{
    var model = jtoken.ToObject<OutputStream>();
}
else
{
    var model = jtoken.ToObject<OutputStreamAMM>();
}

更简单的方法是检查只知道其中一个类的关键字段:

var token = JToken.Parse(jsonString);
if(token.SelectToken("$.average") != null)
{
    val model = token.ToObject<OutputStreamAMM>();
}
else
{
    val model = token.ToObject<OutputStream>();
}

答案 1 :(得分:0)

你能检查json的某些类型的密钥标识符吗?

例如,如果json包含“average”,则表示您具有OutputStreamAMM。如果没有,你有OutputStream。

编写具有该逻辑的函数。