5

次のクラスは、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をプロパティに適用します

Json.NET:ネストされた辞書の逆シリアル化

CustomCreationConverterソースコード

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に取り込むにはどうすればよいですか?

4

1 に答える 1

3

したがって、カスタムコンバーターなしDictionary<>ではなく、これを使用して動作しIDictionary<>ますが、単にではなく、独自のタイプも使用していますobject。「便利な方法」とはどういう意味かわかりませんが、メンバーに注釈を付けてBsonDictionaryOptionsAttribute渡すDictionaryRepresentation.DocumentDictionaryRepresentation.ArrayOfDocument、MongoDBに保持されている形状を変更することができますか?

それ以外の場合、現在の構造化の方法に関して、「便利な方法」とはどういう意味ですか?"_t"可能なタイプが複数ある限り、常にディスクリミネーターを取得します。を使用しているので、それが表示されていると思いますIDictionary<>

于 2012-11-21T12:17:41.817 に答える