是的,您可以使用自定義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);
希望這會有所幫助。
嘗試BsonSerializer.RegisterIdGenerator(typeof(xxx),new XXXObjectIdGenerator()); – Disposer 2014-12-06 15:27:08