NewtonSoft.JSON官方手册中文版【连载5】

即将推出本人原译的NewtonSoft.JSON官方手册中文版完整文档(.chm格式),敬请期待!

序列化特性

可以用来控制Json.NET如何序列化和反序列化.NET对象的特性。

  • JsonObjectAttribute - 放置在一个类上,以控制如何把类序列化为JSON对象。
  • JsonArrayAttribute - 放置在一个集合上,以控制如何把集合序列化为JSON数组。
  • JsonDictionaryAttribute - 放置在字典上,以控制如何把字典序列化为JSON对象。
  • JsonPropertyAttribute - 放置在字段和属性主,以控制如何把字段和属性序列化为JSON对象中的一个属性。
  • JsonConverterAttribute - 要么放置在类上,要么放置在字段和属性上,以指定在序列化过程中要使用哪种JsonConverter。
  • JsonExtensionDataAttribute - 放置在集合字段或属性上,以将没有匹配类成员的属性反序列化到指定的集合中,并在序列化期间写入值。
  • JsonConstructorAttribute - 放置在一个构造器上,指定在反序列化过程中,需要用它来创建类。

标准.NET序列化特性

除了使用内建的Json.NET特性,Json.NET还会查找SerializableAttribute(如果DefaultContractResolver上的IgnoreSerializableAttribute被设置为false)、DataContractAttribute、DataMemberAttribute和NonSerializedAttribute,以及用来确定如何序列化和反序列化JSON的一些特性。

 Note
Json.NET特性优先于标准的.NET序列化特性(例如,如果一个属性上同时出现了JsonPropertyAttribute和DataMemberAttribute,两者都自定义了其名称,则来将使用来自JsonPropertyAttribute的名称)

序列化特性示例

[JsonObject(MemberSerialization.OptIn)]
public class Person
{
  // "John Smith"
  [JsonProperty]
  public string Name { get; set; }
  // "2000-12-15T22:11:03"
  [JsonProperty]
  public DateTime BirthDate { get; set; }
  // new Date(976918263055)
  [JsonProperty]
  public DateTime LastModified { get; set; }
  // not serialized because mode is opt-in
  public string Department { get; set; }
}

Json.NET序列化特性

此节内容包含了以下小节:

  • JsonObjectAttribute
  • JsonArrayAttribute/JsonDictionaryAttribute
  • JsonPropertyAttribute
  • JsonIgnoreAttribute
  • JsonConverterAttribute
  • JsonExtensionDataAttribute
  • JsonConstructorAttribute

JsonObjectAttribute

此特性上的MemberSerialization标志指定了成员序列化到底是opt-in的(必须是具有JsonPropery或DataMember特性的成员才会被序列化),还是opt-out的(默认每个成员都会被序列化,但是带有JsonIgnoreAttribute的成员会被忽略,这是Json.NET的默认行为),还是字段(所有公开的和私有的字段会被序列化,但是属性会被忽略)。

在类型上放 DataContractAttribute是默认成员序列化为opt-in的另一种方式。

此特性上的NamingStrategy设置,可被设置为某个NamingStrategy类型,指定了如何序列化属性名称。

Json.NET将实现IEnumerable的.NET类序列化为JSON数据,用IEnumerable的值来填充。放置JsonObjectAttribute会覆盖此行为,并强迫序列化器序列化类的字段和属性。

JsonArrayAttribute/JsonDictionaryAttribute

JsonArrayAttribute和JsonDictionaryAttribute用来指定类是否被序列化为集合类型。

集合特性具有选项来自定义JsonConverter,类型名称处理,以及应用到集合项的引用的处理。

JsonPropertyAttribute

JsonPropertyAttribute具有很多用法:

  • 默认情况下,JSON属性具有与.NET属性相同的名称。此特性允许自定义名称。
  • JsonPropertyAttribute表明,当成员被序列化为opt-in时,属性应该被序列化。
  • 它包含了在序列化和反序列化处理中的非公开的属性。
  • 它可被用来自定义类型名称、引用、空,以及处理属性值的默认值。
  • 它可以用来自定义序列化属性名称的NamingStrategy。
  • 它可以用来自定义属性集合项JsonConverter,类型名称处理,以及引用处理。

DataMemberAttribute可用作JsonPropertyAttribute的替代品。

JsonIgnoreAttribute

从序列化中排除了一个字段或属性。

NonSerializedAttribute可用作JsonIgnoreAttribute的替代品。

JsonConverterAttribute

JsonConverterAttribute指定了用哪种JsonConverter来转换对象。

此属性既可以放在一个类上,也可以放在一个成员上。当放置在一个类上时,由此属性指定的JsonConverter将是序列化类的默认方式。此特性放在一个字段或属性上时,则指定的JsonConverter将始终有来指定那个值。

使用哪种JsonConverter的优先级顺序,首先是成员特性,然后是类特性,最后是任何传给JsonSerializer的转换器。

JsonConverterAttribute属性示例

public enum UserStatus
{
  NotConfirmed,
  Active,
  Deleted
}
public class User
{
  public string UserName { get; set; }
  [JsonConverter(typeof(StringEnumConverter))]
  public UserStatus Status { get; set; }
}

此示例演示了JsonConverterAttribute可以应用到一个属性上。

要将一个JsonConverter应用到某个集合上的项,既可以使用JsonArrayAttribute、JsonDictionaryAttribute,又可以使用JsonPropertyAttribute,并把ItemConverterType属性设置为你想要使用的转换器类型。

JsonExtensionDataAttribute

JsonExtensionDataAttribute指示JsonSerializer将类型上没有匹配字段或属性的属性反序列化到指定的集合中。在序列化过程中,此集合中的值被写回实例的JSON对象。

 Note
序列化过程中将写入所有的扩展数据,哪怕已经写入了同名的属性。

此示例显示了一个字段上应用了JsonExtensionDataAttribute,在反序列化过程中,不匹配的JSON属性被添加到字段的集合。

类型

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>();
  }
}

用法

string json = @"{
  'DisplayName': 'John Smith',
  'SAMAccountName': 'contoso\\johns'
}";
DirectoryAccount account = JsonConvert.DeserializeObject<DirectoryAccount>(json);
Console.WriteLine(account.DisplayName);
// John Smith
Console.WriteLine(account.Domain);
// contoso
Console.WriteLine(account.UserName);
// johns

JsonConstructorAttribute

JsonConstructorAttribute指示JsonSerializer在反序列化一个类时使用指定的构造器。可以用它来创建一个类,使用一个参数化的构造器,而不是默认构造器,或者如果存在多个构造器,则挑选使用哪个特定参数化的构造器。

类型

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

用法

string json = @"{
  ""UserName"": ""domain\\username"",
  ""Enabled"": true
}";
User user = JsonConvert.DeserializeObject<User>(json);
Console.WriteLine(user.UserName);
// domain\username
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值