Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.IO;
- using System.Reflection;
- using Newtonsoft.Json;
- using Newtonsoft.Json.Serialization;
- namespace TestProject
- {
- class TestConverter : JsonConverter
- {
- public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
- {
- var e = value as BaseClass;
- writer.WriteValue(e.Id);
- }
- public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
- {
- // this method never gets called when using custom contract resolver instead of json converter attributes
- // omitted for brevity
- return null;
- }
- public override bool CanConvert(Type objectType)
- {
- return typeof(BaseClass).IsAssignableFrom(objectType);
- }
- }
- class TestContractResolver : DefaultContractResolver
- {
- protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
- {
- var property = base.CreateProperty(member, memberSerialization);
- if (typeof(BaseClass).IsAssignableFrom(property.PropertyType))
- {
- property.Converter = new TestConverter();
- }
- return property;
- }
- }
- abstract class BaseClass
- {
- public int Id { get { return 0; } }
- }
- class Song : BaseClass
- {
- public string Name { get; set; }
- // when this converter attribute is commented out -> exception
- [JsonConverter(typeof(TestConverter))]
- public Artist Artist { get; set; }
- }
- class Artist : BaseClass
- {
- public string Name { get; set; }
- }
- class Program
- {
- static void Main(string[] args)
- {
- var s = new Song();
- var a = new Artist();
- s.Name = "test 123";
- a.Name = "some singer";
- s.Artist = a;
- var serializer = new JsonSerializer();
- serializer.ContractResolver = new TestContractResolver();
- // serialize value with a reference, works correctly
- var writer = new StringWriter();
- serializer.Serialize(writer, s);
- var json = writer.ToString();
- Console.WriteLine("serialized json: \n" + json);
- // deserialize the value. Custom converter is not used.
- var reader = new JsonTextReader(new StringReader(json));
- var loaded = serializer.Deserialize<Song>(reader);
- // dump the restored object
- Console.WriteLine("\nrestored object:\n" + JsonConvert.SerializeObject(loaded, Formatting.Indented));
- Console.ReadLine();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement