Newtonsoft.Json を使用して、型情報を含むオブジェクトを JSON にシリアル化する方法を教えてください。質問する

Newtonsoft.Json を使用して、型情報を含むオブジェクトを JSON にシリアル化する方法を教えてください。質問する

特定のタイプのオブジェクトをシリアル化するときに、JSON でタイプ名を持つプロパティを保持したいです。コンバーターを作成しました:

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));
    }
}

しかし、オブジェクトをシリアル化しようとすると、ここで無限再帰が発生します。var jObject = JObject.FromObject(value, serializer);そのコンバーターで構成された JsonSerializer の同じインスタンスを使用しているため、これは明らかです。

このコンバーターの使用を禁止し、このシリアライザー用に構成された他のコンバーターを使用するにはどうすればよいですか?

シリアル化したい型:

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; }
}

...

ベストアンサー1

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

おすすめ記事