无论人生经历了什么都要明白,我们既不是最幸运的也不是最不幸的,因为我们所经历的有人早已体会,有人正在经历,有人即将面对,仅此而已。在人生低谷时谨记:我们并不是唯一面对这种处境的人,但却是唯一可以帮助自己真正走出来的人。只要向着阳光前行,办法总会比困难多。
各种相关辅助类:
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);
if (_container.IsRegistered(objectType))
{
contract.DefaultCreator = () => _container.Resolve(objectType);
}
return contract;
}
}
public class TaskController
{
}
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);
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
{
get { return TraceLevel.Verbose; }
}
public void Trace(TraceLevel level,string message,Exception ex)
{
LogEventInfo logEvent = new LogEventInfo
{
Message = message,Level = GetLogLevel(level),Exception = ex
};
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,JsonSerializer serializer)
{
User user = (User) value;
writer.WriteValue(user.UserName);
}
public override object ReadJson(JsonReader reader,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,new JsonSerializerSettings {ContractResolver = new DynamicContractResolver('F')});
Response.Write(startingWithF);
string startingWithL = JsonConvert.SerializeObject(person,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,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,new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects,Binder = knownTypesBinder
});
Response.Write(json);
object newValue = JsonConvert.DeserializeObject(json,Binder = knownTypesBinder
});
Response.Write(newValue.GetType().Name);
}
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);
}
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);
}
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 = "aaron@example.com",Deleted = true,DeletedDate = new DateTime(2013,25),UpdatedDate = new DateTime(2013,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);
Response.Write(starcraft.ReleaseDate);
}
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 = "joe@example.com",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,new JsonSerializerSettings
{
DefaultValueHandling = DefaultValueHandling.Ignore
});
Response.Write(jsonIgnoreDefaultValues);
}
protected void btnSerializationCallbackAttributes_Click(object sender,EventArgs e)
{
SerializationEventTestObject obj = new SerializationEventTestObject();
Response.Write(obj.Member1);
Response.Write(obj.Member2);
Response.Write(obj.Member3);
Response.Write(obj.Member4);
string json = JsonConvert.SerializeObject(obj,Formatting.Indented);
Response.Write(obj.Member1);
Response.Write(obj.Member2);
Response.Write(obj.Member3);
Response.Write(obj.Member4);
obj = JsonConvert.DeserializeObject<SerializationEventTestObject>(json);
Response.Write(obj.Member1);
Response.Write(obj.Member2);
Response.Write(obj.Member3);
Response.Write(obj.Member4);
}
protected void btnDataContractAndDataMemberAttributes_Click(object sender,EventArgs e)
{
FileEntity file = new FileEntity
{
Id = Guid.NewGuid(),Formatting.Indented);
Response.Write(json);
}
protected void btnDeserializeWithDI_Click(object sender,EventArgs e)
{
}
protected void btnSerializeWithDefaultSettings_Click(object sender,EventArgs e)
{
JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
Formatting = Formatting.Indented,ContractResolver = new CamelCasePropertyNamesContractResolver()
};
}
protected void btnSerializeImmutableCollection_Click(object sender,EventArgs e)
{
}
protected void btnDeserializeImmutableCollection_Click(object sender,EventArgs e)
{
string json = @"[ 'One','II','3' ]";
}
protected void btnSerializeExtensionData_Click(object sender,EventArgs e)
{
string json = @"{ 'HourlyRate': 150,'Hours': 40,'TaxRate': 0.125 }";
}
protected void btnSerializeDateFormatString_Click(object sender,EventArgs e)
{
IList<DateTime> dateList = new List<DateTime>
{
new DateTime(2009,12,7,23,0,new DateTime(2010,9,2,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,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);
Response.Write(account.Domain);
Response.Write(account.UserName);
}
}
#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
{
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; }
[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; }
[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
{
public int Member1 { get; set; }
public string Member2 { get; set; }
[JsonIgnore]
public string Member3 { get; set; }
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
{
public Guid Id { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public int Size { get; set; }
}
#endregion
#region Deserialize ExtensionData所需实体类
public class DirectoryAccount
{
public string DisplayName { get; set; }
public string UserName { get; set; }
public string Domain { get; set; }
[JsonExtensionData] private IDictionary<string,JToken> _additionalData;
[OnDeserialized]
private void OnDeserialized(StreamingContext context)
{
string samAccountName = (string) _additionalData["SAMAccountName"];
Domain = samAccountName.Split('\\')[0];
UserName = samAccountName.Split('\\')[1];
}
public DirectoryAccount()
{
_additionalData = new Dictionary<string,JToken>();
}
}
#endregion
结果如图: