Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检查Json是否与特定的C类型匹配?_C#_Json_Serialization - Fatal编程技术网

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

C# 如何检查Json是否与特定的C类型匹配?,c#,json,serialization,C#,Json,Serialization,我的Asp.Net MVC应用程序操作是通过序列化几个C#对象中的一个来返回JSON,具体取决于环境(如果发生错误,如果检索到一种数据类型,则返回一种数据类型,等等) 当我试图在C#windows服务中使用JSON时,我很难确定返回的JSON类型。不幸的是,从我所看到的情况来看,如果JSON不匹配,JSON序列化程序(JSON.Net和RestSharp使用的任何东西)在创建空对象时都没有问题 我理解为什么会发生这种情况,但我不知道如何确定从JSON序列化的值是否合法,或者JSON属性是否匹配,

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

当我试图在C#windows服务中使用JSON时,我很难确定返回的JSON类型。不幸的是,从我所看到的情况来看,如果JSON不匹配,JSON序列化程序(JSON.Net和RestSharp使用的任何东西)在创建空对象时都没有问题

我理解为什么会发生这种情况,但我不知道如何确定从JSON序列化的值是否合法,或者JSON属性是否匹配,序列化程序是否只是创建了一个空对象


有人知道我如何确定JSON和我试图反序列化的类型之间是否存在匹配吗?

我建议使用try-and-catch块,如果反序列化将引发无效参数异常,则字符串的格式不正确。 如果您使用的是System.Web.Script.Serialization

JavaScriptSerializer sel = new JavaScriptSerializer();

try 
{
    return sel.Deserialize<List<YourObjectType>>(jSONString);
}
catch(System.ArgumentException e)
{
     return null;
}
JavaScriptSerializer sel=newJavaScriptSerializer();
尝试
{
返回sel.Deserialize(jSONString);
}
catch(System.e)
{
返回null;
}

我不知道如何准确匹配JSON和C类型。但如果您想检查JSON中的所有属性是否匹配适当的值,您可以执行JSON:

这里我有C型:

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

有三件重要的事情:

  • 若您尝试反序列化不包含事件类中的属性的JSON文本,它将引发异常
  • 如果JSON包含这些属性,但不包含值,它将通过反序列化
  • 若JSON文本包含与事件类相同的属性,但也包含其他属性,则它仍将通过反序列化
下面是示例代码:

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)
{

}
var message=@“{'DataSource':'SomeValue'、'LoadId':'100'、'LoadName':'TEST LOAD'、'MonitorId':'TEST MONITOR'、'MonitorName':'TEST MONITOR'、'Time':'2016-03-04T00:13:00'、'Value':0.0}”;
尝试
{
var convertedObject=JsonConvert.DeserializeObject(消息);
}
捕获(例外情况除外)
{
}

如果没有与泛型类型匹配的json属性,反序列化将不会抛出错误,而是只创建一个空的C#对象
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)
{

}