JSON繼承JsonConverter序列化與反序列化重寫類屬性

風靈使發表於2018-10-13
  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.
在這裡插入圖片描述

相關文章