我目前正在以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; }
}
感谢任何帮助。
答案 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。
编写具有该逻辑的函数。