如何检查 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 中是不是存在字段

如何检查 json 是不是与结构/结构字段匹配

如何使用 System.Linq.Dynamic 检查 JSON 对象是不是与谓词匹配

验证 JSON 是不是匹配类型

如何检查我的 C# 应用程序是不是使用来自 nuget 包的正确平台特定 dll?