如何检查 Json 是不是匹配特定的 C# 类型?
Posted
技术标签:
【中文标题】如何检查 Json 是不是匹配特定的 C# 类型?【英文标题】:How can I check if Json matches a specific C# type?如何检查 Json 是否匹配特定的 C# 类型? 【发布时间】:2011-11-28 16:44:44 【问题描述】:我的 Asp.Net MVC 应用程序操作通过序列化多个 C# 对象之一返回 JSON,具体取决于具体情况(如果发生错误,如果检索到一种数据类型,则为一种数据类型,等等...)。
当我尝试在 C# Windows 服务中使用 JSON 时,我无法确定返回的 JSON 类型。不幸的是,据我所见,如果没有任何 JSON 匹配,JSON 序列化程序(JSON.Net 和任何 RestSharp 使用)在创建空对象时都没有问题。
我理解为什么会发生这种情况,但我很困惑如何确定从 JSON 序列化的值是否合法,或者是否没有任何 JSON 属性匹配并且序列化程序只是创建了一个空对象。
有谁知道我将如何确定 JSON 与我尝试反序列化的类型之间是否存在匹配?
【问题讨论】:
【参考方案1】:我不知道如何在 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)
【讨论】:
【参考方案2】:我建议使用 try 和 catch 块,如果你的反序列化会抛出无效参数异常,那么字符串格式不正确。 如果您使用 System.Web.Script.Serialization
javascriptSerializer sel = new JavaScriptSerializer();
try
return sel.Deserialize<List<YourObjectType>>(jSONString);
catch(System.ArgumentException e)
return null;
【讨论】:
如果没有 json 属性与您的泛型类型匹配,反序列化不会抛出错误,它只会创建一个空的 C# 对象以上是关于如何检查 Json 是不是匹配特定的 C# 类型?的主要内容,如果未能解决你的问题,请参考以下文章
(33)C#模式匹配 ( pattern matching )
检查 json 类型列 PostgreSQL 中是不是存在字段