Newtonsoft.Json 自定义序列化字段

    class Program
    {
        static void Main(string[] args)
        {
            var m = new JsonModel()
            {
                Id = 0,
                Name = "nnnn"
            };

            var json = JsonConvert.SerializeObject(m, new JsonSerializerSettings()
            {
                ContractResolver = new MyContractResolver(new List<string>(){ "Id" })
            });

            Console.WriteLine(json);

        }
    }
    public class JsonModel
    {
        [JsonProperty("myId")]
        public int Id { get; set; }
        public string Name { get; set; }
    }
    public class MyContractResolver : DefaultContractResolver
    {
        private List<string> _names = null;
        public MyContractResolver(List<string> names)
        {
            _names = names;
        }
        protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
        {
            string name = member.Name;
            if (_names.Contains(name))
            return base.CreateProperty(member, memberSerialization);
            return null;
        }
    }

 

Newtonsoft.Json是一个流行的.NET JSON框架,用于在JSON格式和.NET对象之间进行序列化和反序列化。要序列化类中的私有字段,通常需要使用一些额外的技巧,因为默认情况下,Newtonsoft.Json不会序列化私有字段。 一种方法是使用自定义的`JsonConverter`,这个转换器可以让你控制序列化和反序列化的过程。以下是一个简单的自定义`JsonConverter`示例,它允许序列化私有字段: ```csharp using Newtonsoft.Json; using System; using System.Reflection; public class PrivateFieldConverter : JsonConverter { public override bool CanConvert(Type objectType) { return true; } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException("反序列化私有字段不被支持"); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var type = value.GetType(); writer.WriteStartObject(); foreach (FieldInfo fieldInfo in type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)) { object obj = fieldInfo.GetValue(value); var attribute = fieldInfo.GetCustomAttribute<JsonPropertyAttribute>(); var name = attribute != null ? attribute.PropertyName : fieldInfo.Name; serializer.Serialize(writer, name, obj); } writer.WriteEndObject(); } } public class MyObject { [JsonProperty] private int privateField; } ``` 在这个示例中,`PrivateFieldConverter`类覆盖了`WriteJson`方法来遍历所有非公共字段,并使用`JsonSerializer`来序列化它们。`MyObject`类中的私有字段`privateField`通过`JsonProperty`属性标记,以便`PrivateFieldConverter`能够找到并序列化它。 要使用这个转换器,你需要在序列化时指定它: ```csharp var settings = new JsonSerializerSettings { Converters = new List<JsonConverter> { new PrivateFieldConverter() } }; var obj = new MyObject { privateField = 42 }; string json = JsonConvert.SerializeObject(obj, settings); ``` 这样,即使是私有字段也会被包含在序列化JSON字符串中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值