5

以下类应由 API 作为 Json 接收并使用 C# 驱动程序和 Web API 存储在 MongoDB 中。data 属性是非结构化的,但我可以将其限制为键值对,这些值中可能包含嵌套数组。

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,它将一个 List 嵌套到 Dictionary 的值中:

将 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# 特定类型进行构造。嵌套时如何在没有类型值属性的情况下将此数据导入 MongoDB?

4

1 回答 1

3

所以我有这个使用Dictionary<>而不是IDictionary<>没有自定义转换器,但我也使用我自己的类型,而不仅仅是object. 我不清楚你所说的“有用的方式”是什么意思,但你可以注释你的成员BsonDictionaryOptionsAttribute并传入DictionaryRepresentation.DocumentDictionaryRepresentation.ArrayOfDocument更改持久化到 MongoDB 的形状,如果这就是你的意思吗?

否则,关于它现在的结构方式,您所说的“有用方式”是什么意思?"_t"只要有不止一种类型,你总会得到鉴别器。我猜你看到这个是因为你正在使用IDictionary<>.

于 2012-11-21T12:17:41.817 回答