在 .NET 上的 C# 中序列化自定义属性和类属性?

问题描述 投票:0回答:1

我有一个

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 并处理它的其他程序。

c# .net-core json.net nsjsonserialization
1个回答
0
投票

不,Newtonsoft JSON.NET 本身并不序列化自定义属性,但您可以通过创建自定义 JsonConverter 来实现此目的。

但是你可以尝试这种方法:

  • 自定义属性:
    [AttributeUsage(AttributeTargets.Property)]
    public class EncryptedAttribute : Attribute
    {
        public string Key { get; }
        public EncryptedAttribute(string key) => Key = key;
    }
  • 自定义 JsonConverter:
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 输出中的加密属性元数据。 但我同意其他评论者的观点,请三思而后行,这是否是实现您目标的唯一方法;)

© www.soinside.com 2019 - 2024. All rights reserved.