JSON繼承JsonConverter序列化與反序列化重寫類屬性
阿新 • • 發佈:2018-11-11
- 首先自定義一個
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);
}
}
}
- 定義一個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
.