2014-12-06 56 views
2

我有一個MVC .net項目,我正在使用mongodb。 我使用自定義JsonConverter序列化的ObjectId屬性字符串,因爲我在這個答案說明: Automatically retun mongodb ObjectId as string with Json.NET in MVC在沒有屬性的類上全局使用JsonConverter

在那裏我用了一個attribue以便自定義轉換器在某個屬性中使用:[JsonConverter(typeof(ObjectIdConverter))

有沒有辦法告訴序列化程序在ObjectId類型的所有屬性上使用ObjectIdConverter? 我不想在整個項目中繼續並添加此屬性。

謝謝!

+0

嘗試BsonSerializer.RegisterIdGenerator(typeof(xxx),new XXXObjectIdGenerator()); – Disposer 2014-12-06 15:27:08

回答

6

是的,您可以使用自定義IContractResolver以編程方式將JsonConverter應用於類或屬性。最簡單的方法是從DefaultContractResolver類派生解析器,然後重寫適當的方法。下面是指示Json.Net對ObjectId類型的所有實例都使用ObjectIdConverter,不管是什麼類的,他們可能會出現在一個示例解析器。

class CustomResolver : DefaultContractResolver 
{ 
    protected override JsonObjectContract CreateObjectContract(Type objectType) 
    { 
     JsonObjectContract contract = base.CreateObjectContract(objectType); 
     if (objectType == typeof(ObjectId)) 
     { 
      contract.Converter = new ObjectIdConverter(); 
     } 
     return contract; 
    } 
} 

要使用的解析器,你可以構造一個JsonSerializer實例,在其上設置ContractResolver屬性,然後使用該實例進行序列化/反序列化。如果您使用的是JObject.ToObject()JObject.FromObject(),請注意這兩種方法都有超負荷接受JsonSerializer實例。

JsonSerializer serializer = new JsonSerializer(); 
serializer.ContractResolver = new CustomResolver(); 

JObject jo = JObject.FromObject(foo, serializer); 

另外,如果您使用的是JsonConvert類做你的序列化/反序列化,你可以創建一個實例的JsonSerializerSettings,設置了ContractResolver財產,然後通過設置到SerializeObject()DeserializeObject()方法。

JsonSerializerSettings settings = new JsonSerializerSettings(); 
settings.ContractResolver = new CustomResolver(); 

Foo foo = JsonConvert.DeserializeObject<Foo>(json, settings); 

希望這會有所幫助。

+0

非常感謝! – 2014-12-06 18:13:54

+0

沒問題;很高興我能幫上忙。 – 2014-12-06 22:27:36