Json.NET使用入门(三)【设置】

无论人生经历了什么都要明白,我们既不是最幸运的也不是最不幸的,因为我们所经历的有人早已体会,有人正在经历,有人即将面对,仅此而已。在人生低谷时谨记:我们并不是唯一面对这种处境的人,但却是唯一可以帮助自己真正走出来的人。只要向着阳光前行,办法总会比困难多。

各种相关辅助类:

 public class AutofacContractResolver : DefaultContractResolver
     {
         private readonly IContainer _container;

         public AutofacContractResolver(IContainer container)
         {
             _container = container;
         }

         protected override JsonObjectContract CreateObjectContract(Type objectType)
         {
             JsonObjectContract contract = base.CreateObjectContract(objectType);

             // use Autofac to create types that have been registered with it
             if (_container.IsRegistered(objectType))
             {
                 contract.DefaultCreator = () => _container.Resolve(objectType);
             }

             return contract;
         }
     }

     public class TaskController
     {
         //private readonly ITaskRepository _repository;
         //private readonly ILogger _logger;

         //public TaskController(ITaskRepository repository, ILogger logger)
         //{
         // _repository = repository;
         // _logger = logger;
         //}

         //public ITaskRepository Repository
         //{
         // get { return _repository; }
         //}

         //public ILogger Logger
         //{
         // get { return _logger; }
         //}
     }
public class DynamicContractResolver : DefaultContractResolver
  {
      private readonly char _startingWithChar;

      public DynamicContractResolver(char startingWithChar)
      {
          _startingWithChar = startingWithChar;
      }

      protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization   memberSerialization)
      {
          IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization);

          // only serializer properties that start with the specified character
          properties = properties.Where(p => p.PropertyName.StartsWith(_startingWithChar.ToString())).ToList();

          return properties;
      }
  }

  public class Person
  {
      public string FirstName { get; set; }
      public string LastName { get; set; }

      public string FullName
      {
          get { return FirstName + " " + LastName; }
      }
  }
 public class KeysJsonConverter : JsonConverter
  {
      private readonly Type[] _types;

      public KeysJsonConverter(params Type[] types)
      {
          _types = types;
      }

      public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
      {
          JToken t = JToken.FromObject(value);

          if (t.Type != JTokenType.Object)
          {
              t.WriteTo(writer);
          }
          else
          {
              JObject o = (JObject)t;
              IList<string> propertyNames = o.Properties().Select(p => p.Name).ToList();

              o.AddFirst(new JProperty("Keys", new JArray(propertyNames)));

              o.WriteTo(writer);
          }
      }

      public override object ReadJson(JsonReader reader, Type objectType, object existingValue,   JsonSerializer serializer)
      {
          throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter.");
      }

      public override bool CanRead
      {
          get { return false; }
      }

      public override bool CanConvert(Type objectType)
      {
          return _types.Any(t => t == objectType);
      }
  }

  public class Employee
  {
      public string FirstName { get; set; }
      public string LastName { get; set; }
      public IList<string> Roles { get; set; }
  }
 public class KnownTypesBinder : SerializationBinder
   {
       public IList<Type> KnownTypes { get; set; }

       public override Type BindToType(string assemblyName, string typeName)
       {
           return KnownTypes.SingleOrDefault(t => t.Name == typeName);
       }

       public override void BindToName(Type serializedType, out string assemblyName, out    string typeName)
       {
           assemblyName = null;
           typeName = serializedType.Name;
       }
   }

   public class Car
   {
       public string Maker { get; set; }
       public string Model { get; set; }
   }
 public class NLogTraceWriter : ITraceWriter
 {
     private static readonly Logger Logger = LogManager.GetLogger("NLogTraceWriter");

     public TraceLevel LevelFilter
     {
         // trace all messages. nlog can handle filtering
         get { return TraceLevel.Verbose; }
     }

     public void Trace(TraceLevel level, string message, Exception ex)
     {
         LogEventInfo logEvent = new LogEventInfo
         {
             Message = message,
             Level = GetLogLevel(level),
             Exception = ex
         };

         // log Json.NET message to NLog
         Logger.Log(logEvent);
     }

     private LogLevel GetLogLevel(TraceLevel level)
     {
         switch (level)
         {
             case TraceLevel.Error:
                 return LogLevel.Error;
             case TraceLevel.Warning:
                 return LogLevel.Warn;
             case TraceLevel.Info:
                 return LogLevel.Info;
             case TraceLevel.Off:
                 return LogLevel.Off;
             default:
                 return LogLevel.Trace;
         }
     }
 }
 public class UserConverter : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            User user = (User) value;

            writer.WriteValue(user.UserName);
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
            JsonSerializer serializer)
        {
            User user = new User();
            user.UserName = (string) reader.Value;

            return user;
        }

        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof (User);
        }
    }

    [JsonConverter(typeof (UserConverter))]
    public class User
    {
        public string UserName { get; set; }
    }

First.aspx内容:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="First.aspx.cs" Inherits="NewtonsoftDemo.First" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
            <div>
                <table>

                    <tr>
                        <td>
                            <asp:Button ID="btnCustomJsonConverter" runat="server" Text="自定义 JsonConverter" OnClick="btnCustomJsonConverter_Click" />
                        </td>
                        <td>
                            <asp:Button ID="btnCustomIContractResolver" runat="server" Text="自定义 IContractResolver" OnClick="btnCustomIContractResolver_Click" style="height: 27px" /><br />
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <asp:Button ID="btnCustomITraceWriter" runat="server" Text="自定义 ITraceWriter" OnClick="btnCustomITraceWriter_Click" />
                        </td>
                        <td>
                            <asp:Button ID="btnCustomSerializationBinder" runat="server" Text="自定义 SerializationBinder" OnClick="btnCustomSerializationBinder_Click" /><br />
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <asp:Button ID="btnJsonConstructorAttribute" runat="server" Text="JsonConstructorAttribute" OnClick="btnJsonConstructorAttribute_Click" />
                        </td>
                        <td>
                            <asp:Button ID="btnJsonConverterAttributeOnclass" runat="server" Text="JsonConverterAttribute在类上" OnClick="btnJsonConverterAttributeOnclass_Click" /><br />
                        </td>
                    </tr>

                    <tr>
                        <td>
                            <asp:Button ID="btnJsonConverterAttributeOnProperty" runat="server" Text="JsonConverterAttribute在属性上" OnClick="btnJsonConverterAttributeOnProperty_Click" />
                        </td>
                        <td>
                            <asp:Button ID="btnJsonObjectAttributeOptin" runat="server" Text="JsonObjectAttribute选择序列化" OnClick="btnJsonObjectAttributeOptin_Click" /><br />
                        </td>
                    </tr>

                    <tr>
                        <td>
                            <asp:Button ID="btnJsonObjectAttributeForceOs" runat="server" Text="JsonObjectAttribute强行对象序列化" OnClick="btnJsonObjectAttributeForceOs_Click" />
                        </td>
                        <td>
                            <asp:Button ID="btnJsonPropertyAttributeName" runat="server" Text="JsonPropertyAttribute|name" OnClick="btnJsonPropertyAttributeName_Click" /><br />
                        </td>
                    </tr>

                    <tr>
                        <td>
                            <asp:Button ID="btnJsonPropertyAttributeOrder" runat="server" Text="JsonPropertyAttribute|order" OnClick="btnJsonPropertyAttributeOrder_Click" />
                        </td>
                        <td>
                            <asp:Button ID="btnJsonPropertyAttributeRequired" runat="server" Text="JsonPropertyAttribute|required" OnClick="btnJsonPropertyAttributeRequired_Click" /><br />
                        </td>
                    </tr>

                    <tr>
                        <td>
                            <asp:Button ID="btnJsonPropertyAttributeItemsSetting" runat="server" Text="JsonPropertyAttribute items 设置" OnClick="btnJsonPropertyAttributeItemsSetting_Click" />
                        </td>
                        <td>
                            <asp:Button ID="btnJsonPropertyAttributeProSetting" runat="server" Text="JsonPropertyAttribute property 设置" OnClick="btnJsonPropertyAttributeProSetting_Click" /><br />
                        </td>
                    </tr>

                    <tr>
                        <td>
                            <asp:Button ID="btnJsonIgnoreAttribute" runat="server" Text="JsonIgnoreAttribute" OnClick="btnJsonIgnoreAttribute_Click" />
                        </td>
                        <td>
                            <asp:Button ID="btnErrorHandlingAttribute" runat="server" Text="ErrorHandlingAttribute" OnClick="btnErrorHandlingAttribute_Click" /><br />
                        </td>
                    </tr>

                    <tr>
                        <td>
                            <asp:Button ID="btnDefaultValueAttribute" runat="server" Text="DefaultValueAttribute" OnClick="btnDefaultValueAttributeg_Click" />
                        </td>
                        <td>
                            <asp:Button ID="btnSerializationCallbackAttributes" runat="server" Text="序列化回调属性" OnClick="btnSerializationCallbackAttributes_Click" /><br />
                        </td>
                    </tr>

                    <tr>
                        <td>
                            <asp:Button ID="btnDataContractAndDataMemberAttribute" runat="server" Text="DataContract和DataMember属性" OnClick="btnDataContractAndDataMemberAttributes_Click" />
                        </td>
                        <td>
                            <asp:Button ID="btnDeserializeWithDI" runat="server" Text="依赖注入反序列化" OnClick="btnDeserializeWithDI_Click" /><br />
                        </td>
                    </tr>

                    <tr>
                        <td>
                            <asp:Button ID="btnSerializeWithDefaultSettings" runat="server" Text="用默认设置序列化" OnClick="btnSerializeWithDefaultSettings_Click" />
                        </td>
                        <td>
                            <asp:Button ID="btnSerializeImmutableCollection" runat="server" Text="序列化不可变集合" OnClick="btnSerializeImmutableCollection_Click" /><br />
                        </td>
                    </tr>

                    <tr>
                        <td>
                            <asp:Button ID="btnDeserializeImmutableCollection" runat="server" Text="反序列化不可变集合" OnClick="btnDeserializeImmutableCollection_Click" />
                        </td>
                        <td>
                            <asp:Button ID="btnSerializeExtensionData" runat="server" Text="序列化扩展数据" OnClick="btnSerializeExtensionData_Click" />
                        </td>
                    </tr>

                    <tr>
                        <td>
                            <asp:Button ID="btnDeserializeExtensionData" runat="server" Text="反序列化扩展数据" OnClick="btnDeserializeExtensionData_Click" />
                        </td>
                        <td>
                            <asp:Button ID="btnDeserializeDateFormatString" runat="server" Text="反序列化日期格式字符串" OnClick="btnDeserializeDateFormatString_Click" />
                        </td>
                    </tr>



                    <tr>
                        <td>
                            <asp:Button ID="btnSerializeDateFormatString" runat="server" Text="序列化日期格式字符串" OnClick="btnSerializeDateFormatString_Click" />
                        </td>
                        <td>

                        </td>
                    </tr>
                </table>
            </div>
        </form>
    </body>
</html>

First.aspx.cs代码:

 public partial class First : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }

        protected void btnCustomJsonConverter_Click(object sender, EventArgs e)
        {
            Employee employee = new Employee
            {
                FirstName = "James",
                LastName = "Newton-King",
                Roles = new List<string>
                {
                    "Admin"
                }
            };

            string json = JsonConvert.SerializeObject(employee, Formatting.Indented,
                new KeysJsonConverter(typeof (Employee)));

            Response.Write(json);

            Employee newEmployee = JsonConvert.DeserializeObject<Employee>(json,
                new KeysJsonConverter(typeof (Employee)));

            Response.Write(newEmployee.FirstName);
        }

        protected void btnCustomIContractResolver_Click(object sender, EventArgs e)
        {
            Person person = new Person
            {
                FirstName = "Dennis",
                LastName = "Deepwater-Diver"
            };

            string startingWithF = JsonConvert.SerializeObject(person, Formatting.Indented,
                new JsonSerializerSettings {ContractResolver = new DynamicContractResolver('F')});

            Response.Write(startingWithF);

            string startingWithL = JsonConvert.SerializeObject(person, Formatting.Indented,
                new JsonSerializerSettings {ContractResolver = new DynamicContractResolver('L')});

            Response.Write(startingWithL);
        }

        protected void btnCustomITraceWriter_Click(object sender, EventArgs e)
        {
            IList<string> countries = new List<string>
            {
                "New Zealand",
                "Australia",
                "Denmark",
                "China"
            };

            string json = JsonConvert.SerializeObject(countries, Formatting.Indented, new JsonSerializerSettings
            {
                TraceWriter = new NLogTraceWriter()
            });

            Response.Write(json);
        }

        protected void btnCustomSerializationBinder_Click(object sender, EventArgs e)
        {
            KnownTypesBinder knownTypesBinder = new KnownTypesBinder
            {
                KnownTypes = new List<Type> {typeof (Car)}
            };

            Car car = new Car
            {
                Maker = "Ford",
                Model = "Explorer"
            };

            string json = JsonConvert.SerializeObject(car, Formatting.Indented, new JsonSerializerSettings
            {
                TypeNameHandling = TypeNameHandling.Objects,
                Binder = knownTypesBinder
            });

            Response.Write(json);
            // {
            // "$type": "Car",
            // "Maker": "Ford",
            // "Model": "Explorer"
            // }

            object newValue = JsonConvert.DeserializeObject(json, new JsonSerializerSettings
            {
                TypeNameHandling = TypeNameHandling.Objects,
                Binder = knownTypesBinder
            });

            Response.Write(newValue.GetType().Name);
            // Car
        }

        protected void btnJsonConstructorAttribute_Click(object sender, EventArgs e)
        {
            string json = @"{ ""UserName"": ""domain\\username"", ""Enabled"": true }";

            User user = JsonConvert.DeserializeObject<User>(json);

            Response.Write(user.UserName);
            // domain\username
        }

        protected void btnJsonConverterAttributeOnclass_Click(object sender, EventArgs e)
        {
            User user = new User
            {
                UserName = @"domain\username"
            };

            string json = JsonConvert.SerializeObject(user, Formatting.Indented);

            Response.Write(json);
            // "domain\\username"
        }

        protected void btnJsonConverterAttributeOnProperty_Click(object sender, EventArgs e)
        {
            UserEntity user = new UserEntity
            {
                UserName = @"domain\username",
                Status = UserStatus.Deleted
            };

            string json = JsonConvert.SerializeObject(user, Formatting.Indented);

            Response.Write(json);
        }

        protected void btnJsonObjectAttributeOptin_Click(object sender, EventArgs e)
        {
            FileOp file = new FileOp
            {
                Id = Guid.NewGuid(),
                Name = "ImportantLegalDocuments.docx",
                Size = 50*1024
            };

            string json = JsonConvert.SerializeObject(file, Formatting.Indented);

            Response.Write(json);
        }

        protected void btnJsonObjectAttributeForceOs_Click(object sender, EventArgs e)
        {
            DirectoryEntity directory = new DirectoryEntity
            {
                Name = "My Documents",
                Files =
                {
                    "ImportantLegalDocuments.docx",
                    "WiseFinancalAdvice.xlsx"
                }
            };
            string json = JsonConvert.SerializeObject(directory, Formatting.Indented);
            Response.Write(json);
        }

        protected void btnJsonPropertyAttributeName_Click(object sender, EventArgs e)
        {
            Videogame starcraft = new Videogame
            {
                Name = "Starcraft",
                ReleaseDate = new DateTime(1998, 1, 1)
            };

            string json = JsonConvert.SerializeObject(starcraft, Formatting.Indented);

            Response.Write(json);
        }

        protected void btnJsonPropertyAttributeOrder_Click(object sender, EventArgs e)
        {
            AccountData account = new AccountData
            {
                FullName = "Aaron Account",
                EmailAddress = "[email protected]",
                Deleted = true,
                DeletedDate = new DateTime(2013, 1, 25),
                UpdatedDate = new DateTime(2013, 1, 25),
                CreatedDate = new DateTime(2010, 10, 1)
            };
            string json = JsonConvert.SerializeObject(account, Formatting.Indented);
            Response.Write(json);
        }

        protected void btnJsonPropertyAttributeRequired_Click(object sender, EventArgs e)
        {
            string json = @"{ 'Name': 'Starcraft III', 'ReleaseDate': null }";

            Videogame starcraft = JsonConvert.DeserializeObject<Videogame>(json);

            Response.Write(starcraft.Name);
            // Starcraft III

            Response.Write(starcraft.ReleaseDate);
            // null
        }

        protected void btnJsonPropertyAttributeItemsSetting_Click(object sender, EventArgs e)
        {
            EmployeeInfo manager = new EmployeeInfo
            {
                Name = "George-Michael"
            };
            EmployeeInfo worker = new EmployeeInfo
            {
                Name = "Maeby",
                Manager = manager
            };

            BusinessModel business = new BusinessModel
            {
                Name = "Acme Ltd.",
                Employees = new List<EmployeeInfo>
                {
                    manager,
                    worker
                }
            };

            string json = JsonConvert.SerializeObject(business, Formatting.Indented);

            Response.Write(json);
        }

        protected void btnJsonPropertyAttributeProSetting_Click(object sender, EventArgs e)
        {
            Vessel vessel = new Vessel
            {
                Name = "Red October",
                Class = "Typhoon"
            };

            string json = JsonConvert.SerializeObject(vessel, Formatting.Indented);

            Response.Write(json);
        }

        protected void btnJsonIgnoreAttribute_Click(object sender, EventArgs e)
        {
            AccountEntity account = new AccountEntity
            {
                FullName = "Joe User",
                EmailAddress = "[email protected]",
                PasswordHash = "VHdlZXQgJ1F1aWNrc2lsdmVyJyB0byBASmFtZXNOSw=="
            };

            string json = JsonConvert.SerializeObject(account);
            Response.Write(json);
        }

        protected void btnErrorHandlingAttribute_Click(object sender, EventArgs e)
        {
            EmployeeData person = new EmployeeData
            {
                Name = "George Michael Bluth",
                Age = 16,
                Roles = null,
                Title = "Mister Manager"
            };
            string json = JsonConvert.SerializeObject(person, Formatting.Indented);
            Response.Write(json);
        }

        protected void btnDefaultValueAttributeg_Click(object sender, EventArgs e)
        {
            Customer customer = new Customer();

            string jsonIncludeDefaultValues = JsonConvert.SerializeObject(customer, Formatting.Indented);
            Response.Write(jsonIncludeDefaultValues);

            string jsonIgnoreDefaultValues = JsonConvert.SerializeObject(customer, Formatting.Indented,
                new JsonSerializerSettings
                {
                    DefaultValueHandling = DefaultValueHandling.Ignore
                });

            Response.Write(jsonIgnoreDefaultValues);
        }

        protected void btnSerializationCallbackAttributes_Click(object sender, EventArgs e)
        {
            SerializationEventTestObject obj = new SerializationEventTestObject();

            Response.Write(obj.Member1);
            // 11
            Response.Write(obj.Member2);
            // Hello World!
            Response.Write(obj.Member3);
            // This is a nonserialized value
            Response.Write(obj.Member4);
            // null

            string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
            // {
            // "Member1": 11,
            // "Member2": "This value went into the data file during serialization.",
            // "Member4": null
            // }

            Response.Write(obj.Member1);
            // 11
            Response.Write(obj.Member2);
            // This value was reset after serialization.
            Response.Write(obj.Member3);
            // This is a nonserialized value
            Response.Write(obj.Member4);
            // null

            obj = JsonConvert.DeserializeObject<SerializationEventTestObject>(json);

            Response.Write(obj.Member1);
            // 11
            Response.Write(obj.Member2);
            // This value went into the data file during serialization.
            Response.Write(obj.Member3);
            // This value was set during deserialization
            Response.Write(obj.Member4);
            // This value was set after deserialization.
        }

        protected void btnDataContractAndDataMemberAttributes_Click(object sender, EventArgs e)
        {
            FileEntity file = new FileEntity
            {
                Id = Guid.NewGuid(),
                Name = "ImportantLegalDocuments.docx",
                Size = 50*1024
            };

            string json = JsonConvert.SerializeObject(file, Formatting.Indented);

            Response.Write(json);
        }

        protected void btnDeserializeWithDI_Click(object sender, EventArgs e)
        {
        }

        protected void btnSerializeWithDefaultSettings_Click(object sender, EventArgs e)
        {
            // settings will automatically be used by JsonConvert.SerializeObject/DeserializeObject
            JsonConvert.DefaultSettings = () => new JsonSerializerSettings
            {
                Formatting = Formatting.Indented,
                ContractResolver = new CamelCasePropertyNamesContractResolver()
            };

            //Staff s = new Staff
            //{
            // FirstName = "Eric",
            // LastName = "Example",
            // BirthDate = new DateTime(1980, 4, 20, 0, 0, 0, DateTimeKind.Utc),
            // Department = "IT",
            // JobTitle = "Web Dude"
            //};

            //json = JsonConvert.SerializeObject(s);
        }

        protected void btnSerializeImmutableCollection_Click(object sender, EventArgs e)
        {
            //ImmutableList<string> l = ImmutableList.CreateRange(new List<string>
            //{
            // "One",
            // "II",
            // "3"
            //});

            //string json = JsonConvert.SerializeObject(l, Formatting.Indented);

        }

        protected void btnDeserializeImmutableCollection_Click(object sender, EventArgs e)
        {
            string json = @"[ 'One', 'II', '3' ]";

            //ImmutableList<string> l = JsonConvert.DeserializeObject<ImmutableList<string>>(json);

            //foreach (string s in l)
            //{
            // Response.Write(s);
            //}

        }

        protected void btnSerializeExtensionData_Click(object sender, EventArgs e)
        {
            string json = @"{ 'HourlyRate': 150, 'Hours': 40, 'TaxRate': 0.125 }";

            //CustomerInvoice invoice = JsonConvert.DeserializeObject<CustomerInvoice>(json);

            //// increase tax to 15%
            //invoice.TaxRate = 0.15m;

            //string result = JsonConvert.SerializeObject(invoice);

        }

        protected void btnSerializeDateFormatString_Click(object sender, EventArgs e)
        {
            IList<DateTime> dateList = new List<DateTime>
            {
                new DateTime(2009, 12, 7, 23, 10, 0, DateTimeKind.Utc),
                new DateTime(2010, 1, 1, 9, 0, 0, DateTimeKind.Utc),
                new DateTime(2010, 2, 10, 10, 0, 0, DateTimeKind.Utc)
            };

            string json = JsonConvert.SerializeObject(dateList, new JsonSerializerSettings
            {
                DateFormatString = "d MMMM, yyyy",
                Formatting = Formatting.Indented
            });

            Response.Write(json);
        }

        protected void btnDeserializeDateFormatString_Click(object sender, EventArgs e)
        {
            string json = @"[ '7 December, 2009', '1 January, 2010', '10 February, 2010' ]";

            IList<DateTime> dateList = JsonConvert.DeserializeObject<IList<DateTime>>(json, new JsonSerializerSettings
            {
                DateFormatString = "d MMMM, yyyy"
            });

            foreach (DateTime dateTime in dateList)
            {
                Response.Write(dateTime.ToLongDateString());
            }
        }

        protected void btnDeserializeExtensionData_Click(object sender, EventArgs e)
        {
            string json = @"{ 'DisplayName': 'John Smith', 'SAMAccountName': 'contoso\\johns' }";

            DirectoryAccount account = JsonConvert.DeserializeObject<DirectoryAccount>(json);

            Response.Write(account.DisplayName);
            // John Smith

            Response.Write(account.Domain);
            // contoso

            Response.Write(account.UserName);
            // johns
        }
    }

    #region JsonConstructorAttribute所需实体类

    public class User
    {
        [JsonConverter(typeof (UserConverter))]
        public string UserName { get;  set; }

        public bool Enabled { get; private set; }

        public User()
        {
        }

        [JsonConstructor]
        public User(string userName, bool enabled)
        {
            UserName = userName;
            Enabled = enabled;
        }
    }

    #endregion

    #region JsonConverterAttributeOnProperty所需实体类

    public enum UserStatus
    {
        NotConfirmed,
        Active,
        Deleted
    }

    public class UserEntity
    {
        public string UserName { get; set; }

        [JsonConverter(typeof (StringEnumConverter))]
        public UserStatus Status { get; set; }
    }

    #endregion

    #region JsonObjectAttributeOptin所需实体类

    [JsonObject(MemberSerialization.OptIn)]
    public class FileOp
    {
        // excluded from serialization
        // does not have JsonPropertyAttribute
        public Guid Id { get; set; }

        [JsonProperty]
        public string Name { get; set; }

        [JsonProperty]
        public int Size { get; set; }
    }

    #endregion

    #region JsonObjectAttribute Force Object Serialization所需实体类

    [JsonObject]
    public class DirectoryEntity : IEnumerable<string>
    {
        public string Name { get; set; }
        public IList<string> Files { get; set; }

        public DirectoryEntity()
        {
            Files = new List<string>();
        }

        public IEnumerator<string> GetEnumerator()
        {
            return Files.GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }

    #endregion

    #region JsonPropertyAttribute name所需实体类

    public class Videogame
    {
        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("release_date")]
        public DateTime ReleaseDate { get; set; }
    }

    #endregion

    #region JsonPropertyAttribute order所需实体类

    public class AccountData
    {
        public string EmailAddress { get; set; }

        // appear last
        [JsonProperty(Order = 1)]
        public bool Deleted { get; set; }

        [JsonProperty(Order = 2)]
        public DateTime DeletedDate { get; set; }

        public DateTime CreatedDate { get; set; }
        public DateTime UpdatedDate { get; set; }

        // appear first
        [JsonProperty(Order = -2)]
        public string FullName { get; set; }
    }

    #endregion

    #region JsonPropertyAttribute name所需实体类

    public class PS4game
    {
        [JsonProperty(Required = Required.Always)]
        public string Name { get; set; }

        [JsonProperty(Required = Required.AllowNull)]
        public DateTime? ReleaseDate { get; set; }
    }

    #endregion

    #region JsonPropertyAttribute items所需实体类

    public class BusinessModel
    {
        public string Name { get; set; }

        [JsonProperty(ItemIsReference = true)]
        public IList<EmployeeInfo> Employees { get; set; }
    }

    public class EmployeeInfo
    {
        public string Name { get; set; }

        [JsonProperty(IsReference = true)]
        public EmployeeInfo Manager { get; set; }
    }

    #endregion

    #region JsonPropertyAttribute property 所需实体类

    public class Vessel
    {
        public string Name { get; set; }
        public string Class { get; set; }

        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public DateTime? LaunchDate { get; set; }
    }

    #endregion

    #region JsonIgnoreAttribute 所需实体类

    public class AccountEntity
    {
        public string FullName { get; set; }
        public string EmailAddress { get; set; }

        [JsonIgnore]
        public string PasswordHash { get; set; }
    }

    #endregion

    #region ErrorHandlingAttribute所需实体类

    public class EmployeeData
    {
        private List<string> _roles;

        public string Name { get; set; }
        public int Age { get; set; }

        public List<string> Roles
        {
            get
            {
                if (_roles == null)
                {
                    throw new Exception("Roles not loaded!");
                }

                return _roles;
            }
            set { _roles = value; }
        }

        public string Title { get; set; }

        [OnError]
        internal void OnError(StreamingContext context, ErrorContext errorContext)
        {
            errorContext.Handled = true;
        }
    }

    #endregion

    #region DefaultValueAttribute所需实体类

    public class Customer
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }

        [DefaultValue(" ")]
        public string FullName
        {
            get { return FirstName + " " + LastName; }
        }
    }

    #endregion

    #region SerializationEventTestObject所需实体类

    public class SerializationEventTestObject
    {
        // 2222
        // This member is serialized and deserialized with no change.
        public int Member1 { get; set; }

        // The value of this field is set and reset during and 
        // after serialization.
        public string Member2 { get; set; }

        // This field is not serialized. The OnDeserializedAttribute 
        // is used to set the member value after serialization.
        [JsonIgnore]
        public string Member3 { get; set; }

        // This field is set to null, but populated after deserialization.
        public string Member4 { get; set; }

        public SerializationEventTestObject()
        {
            Member1 = 11;
            Member2 = "Hello World!";
            Member3 = "This is a nonserialized value";
            Member4 = null;
        }

        [OnSerializing]
        internal void OnSerializingMethod(StreamingContext context)
        {
            Member2 = "This value went into the data file during serialization.";
        }

        [OnSerialized]
        internal void OnSerializedMethod(StreamingContext context)
        {
            Member2 = "This value was reset after serialization.";
        }

        [OnDeserializing]
        internal void OnDeserializingMethod(StreamingContext context)
        {
            Member3 = "This value was set during deserialization";
        }

        [OnDeserialized]
        internal void OnDeserializedMethod(StreamingContext context)
        {
            Member4 = "This value was set after deserialization.";
        }
    }

    #endregion

    #region DataContract and DataMember Attributes所需实体类

    [DataContract]
    public class FileEntity
    {
        // excluded from serialization
        // does not have DataMemberAttribute
        public Guid Id { get; set; }

        [DataMember]
        public string Name { get; set; }

        [DataMember]
        public int Size { get; set; }
    }

    #endregion

    #region Deserialize ExtensionData所需实体类

    public class DirectoryAccount
    {
        // normal deserialization
        public string DisplayName { get; set; }

        // these properties are set in OnDeserialized
        public string UserName { get; set; }
        public string Domain { get; set; }

        [JsonExtensionData] private IDictionary<string, JToken> _additionalData;

        [OnDeserialized]
        private void OnDeserialized(StreamingContext context)
        {
            // SAMAccountName is not deserialized to any property
            // and so it is added to the extension data dictionary
            string samAccountName = (string) _additionalData["SAMAccountName"];

            Domain = samAccountName.Split('\\')[0];
            UserName = samAccountName.Split('\\')[1];
        }

        public DirectoryAccount()
        {
            _additionalData = new Dictionary<string, JToken>();
        }
    }

    #endregion

结果如图:

你可能感兴趣的:(Json.NET使用入门(三)【设置】)