我有一个
Person
类,在一些属性上具有自定义属性,我想使用 Newtonsoft JSON.NET 功能序列化此类对象。我的自定义属性也应该序列化到 JSON 中。
Newtonsoft JSON.NET 中有内置的东西吗?
public class Person
{
public Int32 Id { get; set; }
public String FirstName { get; set; }
public String LastName { get; set; }
[Encrypted(key="PersonalData")]
public String Address { get; set; }
[Encrypted(key="PersonalData")]
public String Phone { get; set; }
[Encrypted(key="PersonalData")]
public String IdentityDetails{ get; set; }
}
当通过序列化导出 JSON 字符串时,属性上应用的自定义属性也应该作为 JSON 的一部分导出,以便通过查看 JSON 数据,我们可以识别这些属性值是否已加密。这样我们发送 JSON 字符串的其他程序就可以对这些属性值采取相应的操作,我的类不是固定的,我们可以将任何类 JSON 字符串发送到负责读取 JSON 并处理它的其他程序。
不,Newtonsoft JSON.NET 本身并不序列化自定义属性,但您可以通过创建自定义 JsonConverter 来实现此目的。
但是你可以尝试这种方法:
[AttributeUsage(AttributeTargets.Property)]
public class EncryptedAttribute : Attribute
{
public string Key { get; }
public EncryptedAttribute(string key) => Key = key;
}
public class YourCustomAttributeJsonConverter : JsonConverter
{
public override bool CanConvert(Type objectType) => objectType.IsClass;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteStartObject();
foreach (var prop in value.GetType().GetProperties())
{
writer.WritePropertyName(prop.Name);
serializer.Serialize(writer, prop.GetValue(value));
var encryptedAttr = prop.GetCustomAttribute<EncryptedAttribute>();
if (encryptedAttr != null)
{
writer.WritePropertyName($"{prop.Name}_Encrypted");
writer.WriteStartObject();
writer.WritePropertyName("Key");
writer.WriteValue(encryptedAttr.Key);
writer.WriteEndObject();
}
}
writer.WriteEndObject();
}
// Not needed for serialization-only
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
=> throw new NotImplementedException();
}
程序.cs:
var person = new Person { /* set properties */ };
var settings = new JsonSerializerSettings();
settings.Converters.Add(new CustomAttributeJsonConverter());
var json = JsonConvert.SerializeObject(person, settings);
Console.WriteLine(json);
这将包括 JSON 输出中的加密属性元数据。 但我同意其他评论者的观点,请三思而后行,这是否是实现您目标的唯一方法;)