JSON继承JsonConverter序列化与反序列化重写类属性

  1. 首先自定义一个JSON类,继承JsonConverter,把类的属性重写到JSON中.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using GongHuiNewtonsoft.Json;
    using GongHuiNewtonsoft.Json.Linq;
     
    namespace JSONDemo
    {
        public class CustomConverter : JsonConverter
        {
            private readonly Type[] _types;
     
            public CustomConverter(params Type[] types)
            {
                this._types = types;
            }
     
            public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
            {
                JToken t = JToken.FromObject(value);
     
                if (t.Type != JTokenType.Object)
                {
                    t.WriteTo(writer);
                }
                else
                {
                    JObject jo = (JObject)t;
                    IList<string> propertyNameList = jo.Properties().Select(p => p.Name).ToList();
                    jo.AddFirst(new JProperty("Keys", new JArray(propertyNameList)));
                    jo.WriteTo(writer);
                }
            }
     
            public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
            {
                throw new NotImplementedException("Unnecessary because CanRead is false.The type will skip the converter.");
            }
     
            public override bool CanRead
            {
                get
                {
                    return false;
                }
            }
     
            public override bool CanConvert(Type objectType)
            {
                return _types.Any(t => t == objectType);
            }
        }
    }

  1. 定义一个City对象
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace JSONDemo
    {
        public class City
        {
            public string Country { get; set; }
            public IList<string> Name { get; set; }
     
            public City()
            {
                this.Name = new List<string> 
                { 
                    "Auckland",
                    "Wellington",
                    "Hamilton"
                };
            }
        }
    }

3.序列化与反序列化

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using GongHuiNewtonsoft.Json;
    using GongHuiNewtonsoft.Json.Serialization;
    using GongHuiNewtonsoft.Json.Converters;
     
    namespace JSONDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
                City city = new City
                {
                    Country = "New Zealand"
                };
     
                Console.WriteLine("------------自定义序列化添加对象属性------------");
                string json = JsonConvert.SerializeObject(city, Formatting.Indented, new CustomConverter(typeof(City)));
                Console.WriteLine(json);
     
                Console.WriteLine("------------自定义反序列化添加对象属性------------");
                City newCity = JsonConvert.DeserializeObject<City>(json, new CustomConverter(typeof(City)));
                Console.WriteLine(newCity.Country);
                Console.WriteLine(newCity.Name.Count);
                Console.WriteLine(string.Join("/", newCity.Name.ToArray()));
            }
        }
    }

4.运行的结果,注意:序列化City对象时,添加了Keys对象的属性,反序列化时属性中的值多添加了一次,使得Name属性总数量是6.,而不是3.
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值