1. 程式人生 > >JSON繼承JsonConverter序列化與反序列化重寫類屬性

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.
在這裡插入圖片描述