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

本文关键字:类型 是否 何检查 检查 Json | 更新日期: 2023-09-27 18:10:04

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

当我尝试在c# windows服务中使用JSON时,我很难找出返回的JSON类型。不幸的是,从我所看到的,JSON序列化器(JSON。Net和任何RestSharp使用的)都没有问题,如果没有一个JSON匹配创建一个空对象。

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

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

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

我不知道如何匹配JSON和c#类型。如果你想检查JSON中是否匹配合适的值你可以使用JSON序列化属性:

这里我有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文本的适当属性。

有三件重要的事:

  • 如果你试图反序列化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)
{
}

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

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