【问题标题】:Setting IgnoreSerializableAttribute Globally in Json.net在 Json.net 中全局设置 IgnoreSerializableAttribute
【发布时间】:2012-06-22 22:32:15
【问题描述】:

我正在开发一个 ASP.NET WebApi (Release Candidate) 项目,我正在使用几个标有 [Serializable] 属性的 DTO。这些 DTO 不在我的控制范围内,因此我无法以任何方式修改它们。当我从 get 方法返回其中任何一个时,生成的 JSON 包含一堆 k__BackingFields,如下所示:

<Name>k__BackingField=Bobby
<DateCreated>k__BackingField=2012-06-19T12:35:18.6762652-05:00

根据我所做的搜索,这似乎是一个 problem with JSON.NET's IgnoreSerializableAttribute 设置,为了解决我的问题,我只需要按照文章的建议在全局范围内设置它。如何在 ASP.NET Web api 项目中全局更改此设置?

【问题讨论】:

    标签: json.net asp.net-web-api


    【解决方案1】:

    我找到了摆脱名称中的 k__BackingField 的简单方法。

    这个片段应该在 Global.asax.cs 的 Application_Start() 中的某个地方:

    JsonSerializerSettings jSettings = new Newtonsoft.Json.JsonSerializerSettings();
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = jSettings;
    

    看起来默认设置可以解决这个问题。

    【讨论】:

    • 对任何使用 MVC4/WebApi 的人来说非常有用的提示!
    • 它甚至对我有用。我们可以在 IIS 中进行此默认设置吗?
    【解决方案2】:

    由于该库没有为 DefaultContractResolver 公开静态设置器,我建议您在 JsonConvert 上创建一个静态包装器,它是 Serialize*/Deserialize* 方法(至少是您使用的方法)。

    在您的静态包装器中,您可以定义一个静态合约解析器:

    private static readonly DefaultContractResolver Resolver = new DefaultContractResolver
    {
        IgnoreSerializableAttribute = true
    };
    

    您可以将其传递给包装器内JsonSerializerSettings 中的每个序列化方法。 然后你在整个项目中调用你的类。

    另一种方法是获取 JSON.NET 源代码并自行调整以默认使用该属性。

    【讨论】:

    • 我会试一试。感谢您的帮助!
    • 这条线放在哪里?
    【解决方案3】:

    对我来说,以下解决了循环引用和k__BackingField 的问题。

    在您的 WebApiConfig 中,将以下内容添加到 Register() 方法中:

    JsonSerializerSettings jSettings = new Newtonsoft.Json.JsonSerializerSettings {
    
        ContractResolver = new DefaultContractResolver {
            IgnoreSerializableAttribute = true
        },
        ReferenceLoopHandling = ReferenceLoopHandling.Ignore
    };
    
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = jSettings;
    

    【讨论】:

      【解决方案4】:

      朋友,不要这样声明属性:

      public String DiscretionCode { get; set; } 
      

      但是,创建辅助变量,就像旧的......

      private String discretionCode;
      
      public String DiscretionCode 
      { 
          get { return discretionCode;}
          set { discretionCode = value; }
      }
      

      【讨论】:

      • 请解释一下你的理由
      • 在第一种形式中,编译器会自动为您创建变量(支持字段)。第二种形式没有第一种的优势,写起来比较费时间,也比较难读。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-05
      相关资源
      最近更新 更多