如何检查Json是否与特定的C#类型匹配?

时间:2011-09-30 18:31:05

标签: c# json serialization

我的Asp.Net MVC应用程序操作是通过序列化几个C#对象中的一个来返回JSON,具体取决于具体情况(如果发生错误,如果检索到一种类型的数据,则为一种数据类型等)。

当我尝试在C#windows服务中使用JSON时,我无法确定要返回的JSON类型。不幸的是,从我所看到的,如果没有JSON匹配,JSON序列化器(JSON.Net和RestSharp使用的任何东西)都可以创建一个空对象。

我理解为什么会发生这种情况,但我很困惑如何判断从JSON序列化的值是否合法,或者是否所有JSON属性都匹配且序列化程序只是创建了一个空对象。

有谁知道如何确定JSON与我尝试反序列化的类型之间是否存在匹配?

2 个答案:

答案 0 :(得分:0)

我建议使用try和catch块,如果你的反序列化会抛出无效的参数异常,那么字符串格式不正确。 如果您使用的是System.Web.Script.Serialization

JavaScriptSerializer sel = new JavaScriptSerializer();

try 
{
    return sel.Deserialize<List<YourObjectType>>(jSONString);
}
catch(System.ArgumentException e)
{
     return null;
}

答案 1 :(得分:0)

我不确切知道如何在JSON和C#类型之间进行匹配。但是如果你想检查JSON中匹配适当值的所有属性你可以做Json Serialization Sttributes

这里我有C#类型:

[JsonObject(ItemRequired = Required.Always)]
public class Event
{
    public string DataSource { get; set; }
    public string LoadId { get; set; }
    public string LoadName { get; set; }
    public string MonitorId { get; set; }
    public string MonitorName { get; set; }
    public DateTimeOffset Time { get; set; }
    public decimal Value { get; set; }
}

我使用属性[JsonObject(ItemRequired = Required.Always)]修饰了该类型,该属性要求所有属性都使用JSON文本中的相应属性进行填充。

有三个重要的事情:

  • 如果您尝试反序列化不包含Event类中的属性的JSON文本,则会抛出异常。
  • 如果JSON包含这些属性,但不包含值,则它将通过反序列化。
  • 如果JSON文本包含与Event类相同的属性,但也包含其他属性,它仍将通过反序列化。

以下是示例代码:

var message = @"{ 'DataSource':'SomeValue','LoadId':'100','LoadName':'TEST LOAD','MonitorId':'TEST MONITOR','MonitorName':'TEST MONITOR','Time':'2016-03-04T00:13:00','Value':0.0}";
try
{
   var convertedObject = JsonConvert.DeserializeObject<Event>(message);
}
catch (Exception ex)
{

}