2013-10-14 29 views
19

我想序列化某些類型的對象時,在JSON中有一個類型名稱的屬性。 我寫了一個轉換器:如何使用Newtonsoft.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; } 
} 

... 
+0

後的你正在試圖序列類型的代碼。 – Aybe

回答

2

您是否嘗試過創建的JsonSerializer一個新實例,然後從原始串行復制所有轉換器除了引起無限遞歸的轉換?

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
{ 
    JsonSerializerSettings settings = new JsonSerializerSettings 
    { 
     Converters = serializer.Converters.Where(s => !(s is TypeInfoConverter)).ToList() 
     // also copy any other custom settings from the serializer you wish to pass through 
     DateFormatHandling = serializer.DateFormatHandling, 
     MissingMemberHandling = serializer.MissingMemberHandling, 
     NullValueHandling = serializer.NullValueHandling, 
     Formatting = serializer.Formatting 
    }; 
    var localSerializer = JsonSerializer.Create(settings); 

    var jObject = JObject.FromObject(value, localSerializer); 
    jObject.AddFirst(new JProperty("Type", value.GetType().Name)); 
    jObject.WriteTo(writer); 
} 
+0

但我仍然需要其他JsonSerializerSettings像DateFormatHandling,MissingMemberHandling等 – Exta

+0

是的,我注意到在上面的代碼註釋。只需將您需要的設置從外部串行器複製到新的。 –

10
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); 
} 
+2

這是比我的更好的解決方案。實際上你可以像最初一樣做'jObject.WriteTo(writer,converters)'而不是單獨編寫每個屬性。 –

相關問題