• <tfoot id='tVDos'></tfoot>

  • <i id='tVDos'><tr id='tVDos'><dt id='tVDos'><q id='tVDos'><span id='tVDos'><b id='tVDos'><form id='tVDos'><ins id='tVDos'></ins><ul id='tVDos'></ul><sub id='tVDos'></sub></form><legend id='tVDos'></legend><bdo id='tVDos'><pre id='tVDos'><center id='tVDos'></center></pre></bdo></b><th id='tVDos'></th></span></q></dt></tr></i><div id='tVDos'><tfoot id='tVDos'></tfoot><dl id='tVDos'><fieldset id='tVDos'></fieldset></dl></div>

    <small id='tVDos'></small><noframes id='tVDos'>

      <legend id='tVDos'><style id='tVDos'><dir id='tVDos'><q id='tVDos'></q></dir></style></legend>
        <bdo id='tVDos'></bdo><ul id='tVDos'></ul>

      1. 有没有办法在不使用 JsonIgnore 属性的情况下忽略

        时间:2023-08-24
        • <bdo id='MYfdP'></bdo><ul id='MYfdP'></ul>
          1. <small id='MYfdP'></small><noframes id='MYfdP'>

                <tbody id='MYfdP'></tbody>

              1. <tfoot id='MYfdP'></tfoot>
                <legend id='MYfdP'><style id='MYfdP'><dir id='MYfdP'><q id='MYfdP'></q></dir></style></legend>

                • <i id='MYfdP'><tr id='MYfdP'><dt id='MYfdP'><q id='MYfdP'><span id='MYfdP'><b id='MYfdP'><form id='MYfdP'><ins id='MYfdP'></ins><ul id='MYfdP'></ul><sub id='MYfdP'></sub></form><legend id='MYfdP'></legend><bdo id='MYfdP'><pre id='MYfdP'><center id='MYfdP'></center></pre></bdo></b><th id='MYfdP'></th></span></q></dt></tr></i><div id='MYfdP'><tfoot id='MYfdP'></tfoot><dl id='MYfdP'><fieldset id='MYfdP'></fieldset></dl></div>
                  本文介绍了有没有办法在不使用 JsonIgnore 属性的情况下忽略 Json.NET 中的 get-only 属性?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  有没有办法使用 Json.NET 序列化程序但不使用 JsonIgnore 属性?

                  Is there a way to ignore get-only properties using the Json.NET serializer but without using JsonIgnore attributes?

                  例如,我有一个具有这些获取属性的类:

                  For example, I have a class with these get properties:

                      public Keys Hotkey { get; set; }
                  
                      public Keys KeyCode
                      {
                          get
                          {
                              return Hotkey & Keys.KeyCode;
                          }
                      }
                  
                      public Keys ModifiersKeys
                      {
                          get
                          {
                              return Hotkey & Keys.Modifiers;
                          }
                      }
                  
                      public bool Control
                      {
                          get
                          {
                              return (Hotkey & Keys.Control) == Keys.Control;
                          }
                      }
                  
                      public bool Shift
                      {
                          get
                          {
                              return (Hotkey & Keys.Shift) == Keys.Shift;
                          }
                      }
                  
                      public bool Alt
                      {
                          get
                          {
                              return (Hotkey & Keys.Alt) == Keys.Alt;
                          }
                      }
                  
                      public Modifiers ModifiersEnum
                      {
                          get
                          {
                              Modifiers modifiers = Modifiers.None;
                  
                              if (Alt) modifiers |= Modifiers.Alt;
                              if (Control) modifiers |= Modifiers.Control;
                              if (Shift) modifiers |= Modifiers.Shift;
                  
                              return modifiers;
                          }
                      }
                  
                      public bool IsOnlyModifiers
                      {
                          get
                          {
                              return KeyCode == Keys.ControlKey || KeyCode == Keys.ShiftKey || KeyCode == Keys.Menu;
                          }
                      }
                  
                      public bool IsValidKey
                      {
                          get
                          {
                              return KeyCode != Keys.None && !IsOnlyModifiers;
                          }
                      }
                  

                  我是否需要将 [JsonIgnore] 添加到所有这些(我还有许多其他类),或者有更好的方法来忽略所有仅获取属性?

                  Do I need to add [JsonIgnore] to all of them (I also have many other classes), or there is better way to ignore all get-only properties?

                  推荐答案

                  您可以通过实现自定义 IContractResolver 并在序列化期间使用它来做到这一点.如果您将 DefaultContractResolver 子类化,这将变得非常容易:

                  You can do this by implementing a custom IContractResolver and using that during serialization. If you subclass the DefaultContractResolver, this becomes very easy to do:

                  class WritablePropertiesOnlyResolver : DefaultContractResolver
                  {
                      protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
                      {
                          IList<JsonProperty> props = base.CreateProperties(type, memberSerialization);
                          return props.Where(p => p.Writable).ToList();
                      }
                  }
                  

                  这是一个演示如何使用它的测试程序:

                  Here is a test program demonstrating how to use it:

                  using System;
                  using System.Collections.Generic;
                  using System.Linq;
                  using Newtonsoft.Json;
                  using Newtonsoft.Json.Serialization;
                  
                  class Program
                  {
                      static void Main(string[] args)
                      {
                          Widget w = new Widget { Id = 2, Name = "Joe Schmoe" };
                  
                          JsonSerializerSettings settings = new JsonSerializerSettings
                          {
                              ContractResolver = new WritablePropertiesOnlyResolver()
                          };
                  
                          string json = JsonConvert.SerializeObject(w, settings);
                  
                          Console.WriteLine(json);
                      }
                  }
                  
                  class Widget
                  {
                      public int Id { get; set; }
                      public string Name { get; set; }
                      public string LowerCaseName
                      {
                          get { return (Name != null ? Name.ToLower() : null); }
                      }
                  }
                  

                  这是上面的输出.请注意,只读属性 LowerCaseName 未包含在输出中.

                  Here is the output of the above. Notice that the read-only property LowerCaseName is not included in the output.

                  {"Id":2,"Name":"Joe Schmoe"}
                  

                  这篇关于有没有办法在不使用 JsonIgnore 属性的情况下忽略 Json.NET 中的 get-only 属性?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                  上一篇:在 C# 中通过 POST 发送 JSON 并接收返回的 JSON? 下一篇:Json.NET 用最少的小数位序列化浮点/双精度,即没

                  相关文章

                  最新文章

                    1. <tfoot id='vSuOj'></tfoot>
                        <bdo id='vSuOj'></bdo><ul id='vSuOj'></ul>

                      <i id='vSuOj'><tr id='vSuOj'><dt id='vSuOj'><q id='vSuOj'><span id='vSuOj'><b id='vSuOj'><form id='vSuOj'><ins id='vSuOj'></ins><ul id='vSuOj'></ul><sub id='vSuOj'></sub></form><legend id='vSuOj'></legend><bdo id='vSuOj'><pre id='vSuOj'><center id='vSuOj'></center></pre></bdo></b><th id='vSuOj'></th></span></q></dt></tr></i><div id='vSuOj'><tfoot id='vSuOj'></tfoot><dl id='vSuOj'><fieldset id='vSuOj'></fieldset></dl></div>
                      <legend id='vSuOj'><style id='vSuOj'><dir id='vSuOj'><q id='vSuOj'></q></dir></style></legend>

                    2. <small id='vSuOj'></small><noframes id='vSuOj'>