- 首先自定义一个
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
.