2014-10-31 76 views
1

我已經創建了幾個映射到Schema.org對象的類;使用Json.Net中的不同JsonProperty序列化類型信息

public class Thing { 
    public virtual string FullSchemaType { get { return "[schema.org]Thing"; } } 
} 

public class CreativeWork : Thing { 
    public override string FullSchemaType {get {return string.Join(":", base.FullSchemaType, "CreativeWork"); } } 

    [JsonProperty("author")] 
    public string Author { get;set; } 
    // etc 
} 

public class MediaObject : CreativeWork { 
    public override string FullSchemaType {get {return string.Join(":", base.FullSchemaType, "MediaObject"); } } 

    [JsonProperty("duration")] 
    public float? Duration { get;set; } 
} 

我有一個工廠類,創建例如一個MediaObject,設置它的屬性。 FullSchemaType屬性是符合Schema.org標準的注意其類型的方式。我將這些對象放到數據庫中,使用Json.NET 6.0.3對它們進行序列化。

我想將它們反序列化爲正確的C#對象。標準的Json.Net方法是使用TypeNameHandling - 但是在序列化的Json中插入了一個$ type屬性,這並不理想,因爲我們有幾個不同的應用程序連接到這個數據庫。

有沒有辦法告訴Json.NET查看我的FullSchemaType屬性的類型綁定信息?

回答

2

您可以使用JsonSerializerSettings自定義序列化的參數:設置TypeNameHandling = TypeNameHandling.None讓你不包括序列化的Json $類型信息,如果你有,比如說,定製的轉換器的其他問題,您可以使用JsonSerializerSettings.IList<JsonConverter>設置來指定的。

更詳細的信息是在這裏:JsonSerializerSettings

這裏:Newtonsoft.Json.TypeNameHandling

,這裏是的JsonCreationConverter一個很好的例子,你可以在自己的轉換器,基於JsonConverter這樣overrride方法ReadJson:

public override object ReadJson(JsonReader reader, 
           Type objectType, 
           object existingValue, 
           JsonSerializer serializer) 
{ 
    // Load JObject from stream 
    JObject jObject = JObject.Load(reader); 

    if (jObject[FullSchemaType] == {your_media_object_type_name}) 
     MediaObject target = Create(objectType, jObject); 
    else if (jObject[FullSchemaType] == {your_creative_work_type_name}) 
     CreativeWork target = Create(objectType, jObject); 
    else 
     Thing target = Create(objectType, jObject); 

    // Populate the object properties 
    serializer.Populate(jObject.CreateReader(), target); 

    return target; 
} 
+0

我需要的類型信息 - 我只是不希望它被稱爲$類型。 FullSchemaType已被序列化,所以我想能夠使用該屬性。 – rikkit 2014-10-31 14:04:06

+0

那麼,爲什麼不從這個答案實現你自己的JsonCreationConverter類呢? http://stackoverflow.com/questions/8030538/how-to-implement-custom-jsonconverter-in-json-net-to-deserialize-a-list-of-base?rq=1 – ZuoLi 2014-10-31 14:08:11