C# Newtonsoft 六个值得使用的特性(上)
1. JsonProperty
public class User
{
[JsonProperty("ID")]
public int Id { get; set; }
[JsonProperty("Name")]
public string UserName { get; set; }
[JsonProperty("IsAdmin")]
public bool IsAdmin { get; set; }
}
JsonProperty 特性用于指定序列化和反序列化时 Json 对象中的属性名称。在上述示例中,JsonProperty("ID") 指定了 User 类型对象在序列化为 Json 对象时,Id 属性对应 Json 对象中的 "ID" key。反之,在反序列化时,“ID” key 会映射到 User 对象的 Id 属性。
2. JsonConverter
public class UserConverter : JsonConverter<User>
{
public override User ReadJson(JsonReader reader, Type objectType, User existingValue, bool hasExistingValue, JsonSerializer serializer)
{
JObject obj = JObject.Load(reader);
User user = new User();
user.Id = (int)obj["UserID"];
user.UserName = obj["Name"].ToString();
user.IsAdmin = (bool)obj["IsAdmin"];
return user;
}
public override void WriteJson(JsonWriter writer, User value, JsonSerializer serializer)
{
JObject obj = new JObject();
obj["UserID"] = value.Id;
obj["Name"] = value.UserName;
obj["IsAdmin"] = value.IsAdmin;
obj.WriteTo(writer);
}
}
JsonConverter 特性可以实现对序列化和反序列化过程的细粒度控制(即在需要以不同的方式序列化和反序列化时,可以自定义转换逻辑)。上述示例演示了如何使用自定义的 UserConverter 类型实现 User 类型的序列化和反序列化过程。
3. JsonExtensionData
public class User
{
public int Id { get; set; }
public string UserName { get; set; }
public bool IsAdmin { get; set; }
[JsonExtensionData]
private IDictionary<string, JToken> _extraFields;
public IDictionary<string, JToken> ExtraFields
{
get { return _extraFields; }
}
}
JsonExtensionData 特性用于将 Json 对象中的未知属性序列化为键值对字典类型,并在 Json 反序列化时将其存储至注解对应的字段中。在上述示例中,未知属性将会被序列化成 ExtraFields 字段,在反序列化时 _extraFields 字段将会存储未定义的 Json 对象属性键与值的映射关系。
4. JsonConstructor
public class User
{
public int Id { get; set; }
public string UserName { get; set; }
public bool IsAdmin { get; set; }
[JsonConstructor]
public User(int id, string userName, bool isAdmin)
{
Id = id;
UserName = userName;
IsAdmin = isAdmin;
}
}
JsonConstructor 特性用于指定反序列化时使用的构造函数。在上述示例中,首先定义了 User 类型默认的属性成员,接着指定了一个JsonConstructor 特性的构造函数,该构造函数被用于通过 Json 反序列化对象时的“构造过程”。
5. JsonIgnore
public class User
{
public int Id { get; set; }
[JsonIgnore]
public string Password { get; set; }
}
JsonIgnore 特性用于配置在序列化对象时需要忽略的属性或字段。在上述示例中,Password 属性被标注 Ignored 不会被序列化为 Json 对象。
6. JsonSubtypes
[JsonConverter(typeof(JsonSubtypes), "type")]
[JsonSubtypes.KnownSubType(typeof(Circle), "circle")]
[JsonSubtypes.KnownSubType(typeof(Rectangle), "rectangle")]
public abstract class Shape
{
public int X { get; set; }
public int Y { get; set; }
}
public class Circle : Shape
{
public int Radius { get; set; }
}
public class Rectangle : Shape
{
public int Width { get; set; }
public int Height { get; set; }
}
JsonSubtypes 特性用于在序列化或反序列化对象时实现基于类型的动态类型判断。在上述示例中,JsonSubtypes(KnownSubType...) 的约束指定在“type”属性(即 Json 对象中“type”所属的键),当值为“circle”时,反序列化成 Circle 类型对象,反之,反序列化成 Rectangle 类型对象。
下面给出一个完整的示例,如何将一个待序列化成 Json 对象的 User 类型对象中的名字 UserName 以“Hello, ”前缀的格式序列化。
public class User
{
public int Id { get; set; }
public string UserName { get; set; }
public bool IsAdmin { get; set; }
public User(int id, string userName, bool isAdmin)
{
Id = id;
UserName = userName;
IsAdmin = isAdmin;
}
}
public class Program
{
public static void Main(string[] args)
{
var user = new User(1, "Tom", false);
var settings = new JsonSerializerSettings
{
ContractResolver = new CustomContractResolver()
};
Console.WriteLine(JsonConvert.SerializeObject(user, settings));
}
private class CustomContractResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
if (property.PropertyName == "UserName")
{
property.ValueProvider = new PrefixedValueProvider();
}
return property;
}
}
private class PrefixedValueProvider : IValueProvider
{
public object GetValue(object target)
{
return "Hello, " + target.GetType().GetProperty("UserName").GetValue(target);
}
public void SetValue(object target, object value)
{
target.GetType().GetProperty("UserName").SetValue(target, value);
}
}
}
在示例中,自定义实现了 ContractResolver 策略,并在“UserName”属性对应的属性值的读和写操作过程进行了操作。最终,在序列化的过程中,UserName 属性值的前缀被更改为“Hello, ”。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# Newtonsoft 六个值得使用的特性(上) - Python技术站