【问题标题】: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 与我尝试反序列化的类型之间是否存在匹配?

【问题讨论】:

    标签: c# json serialization


    【解决方案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# 对象
      猜你喜欢
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      • 1970-01-01
      • 2023-02-16
      • 2015-01-22
      • 2020-05-16
      相关资源
      最近更新 更多