次のクラスは、APIによってJsonとして受信され、C#ドライバーとWebAPIを使用してMongoDBに格納されます。データプロパティは構造化されていませんが、これらの値にネストされた配列を持つ可能性のあるキーと値のペアに制限できます。
public class Something
{
[BsonId, JsonIgnore]
public ObjectId _id { get; set; }
public IDictionary<string, object> data { get; set; }
}
jsonがクライアントから投稿されると、Json.NETは適切に逆シリアル化します。
クラスをMongoDBに保存すると、データベースにc#固有のタイプの次のようなものが表示されます。
{
property1: 'one',
property2: {
_t: 'System.Collections.Generic.List`1[System.Object]'
_v:
[
{}, {}, {}, ...
]
}
}
これらのソースに基づいて、リストをディクショナリの値にネストするJson.NET用のCustomCreationConverterをまとめました。
JsonDictionaryAttributesをプロパティに適用します
public class Something
{
...
[JsonProperty(ItemConverterType = typeof(CustomConverter))]
public IDictionary<string, object> data { get; set; }
}
このオーバーライドで:
public class CustomConverter : CustomCreationConverter<IList<object>>
{
public override IList<object> Create(Type objectType)
{
return new List<object>();
}
public override bool CanConvert(Type objectType)
{
return true; // Just to keep it simple
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.StartArray)
return base.ReadJson(reader, objectType, existingValue, serializer);
return serializer.Deserialize(reader);
}
}
これは実際には問題なく機能しますが、MongoDBでc#固有の型を使用して構築できます。ネストされたときにtype-valueプロパティなしでこのデータをMongoDBに取り込むにはどうすればよいですか?