I want to have a property with type name in JSON when I serialize objects of certain types. I wrote a converter:
public class TypeInfoConverter : JsonConverter {     private readonly IEnumerable<Type> _types;      public TypeInfoConverter(IEnumerable<Type> types) {         Contract.Requires(types != null);          _types = types;     }      public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {         var jObject = JObject.FromObject(value, serializer);         jObject.AddFirst(new JProperty("Type", value.GetType().Name));         jObject.WriteTo(writer);     }      public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {         return serializer.Deserialize(reader, objectType);     }      public override bool CanConvert(Type objectType) {         return _types.Any(t => t.IsAssignableFrom(objectType));     } }   But when I'm trying to serialize object I have an infinity recursion here:  var jObject = JObject.FromObject(value, serializer); It is obvious because I use the same instance of JsonSerializer which was configured with that converter. 
How to prevent using this converter, but I want to use other converters which configured for this serializer?
Types which I want to serialize:
public interface ITaskResult { }  public class UserHasRejectedOffer : ITaskResult {     public string Message { get; set; } }  public class UserHasFilledForm : ITaskResult {     public string FormValue1 { get; set; }      public string Formvalue2 { get; set; } }  ... 
                SerializeObject Method (Object, Type, JsonSerializerSettings) Serializes the specified object to a JSON string using a type, formatting and JsonSerializerSettings.
JsonPropertyAttribute indicates that a property should be serialized when member serialization is set to opt-in. It includes non-public properties in serialization and deserialization. It can be used to customize type name, reference, null, and default value handling for the property value.
JSON is a format that encodes objects in a string. Serialization means to convert an object into that string, and deserialization is its inverse operation (convert string -> object).
var jsonSerializerSettings = new JsonSerializerSettings() {      TypeNameHandling = TypeNameHandling.All }; var json = JsonConvert.SerializeObject(instance, jsonSerializerSettings);   http://james.newtonking.com/json/help/index.html?topic=html/SerializationSettings.htm
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)      var converters = serializer.Converters.Where(x => !(x is TypeInfoConverter)).ToArray();      var jObject = JObject.FromObject(value);     jObject.AddFirst(new JProperty("Type", value.GetType().Name));     jObject.WriteTo(writer, converters); } 
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With