2012-10-09 65 views
2

比方说,这是2个BSON文件反序列化嵌套和非结构化BsonDocument(MongoDB的C#驱动程序)

{ 
    "_id": "...", 
    "name": "Test1", 
    "sub": { 
     "street": "134 Fake Street", 
     "city": "NoWhere" 
    } 
}, 
{ 
    "_id": "...", 
    "name": "Test2", 
    "sub": { 
     "height": "10", 
     "width": "20", 
     "sub2": { 
      "type": "something" 
     } 
    } 
} 

,其中第一级是一个结构化的类,但分层次可以完全非结构化并且还可以有一个集合嵌套文件深几层。

我该如何将此文档反序列化为C#类?我所看到的所有样本都假设嵌套文档中有一些结构。

下面的类提供了一个错误:

public class Report 
{ 
    [BsonId] 
    public ObjectId _id { get; set; } 

    public string name { get; set; } 

    public BsonDocument sub { get; set; } 
} 

Type 'MongoDB.Bson.BsonString' with data contract name '...' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

编辑

我试图做的可能是完全无感。仅使用一个BsonDocument并在没有结构化类的情况下手动处理所有内容是更好的主意?

+0

尝试使用动态keyword.This这样你的非结构化数据将被映射到在运行一个补充C#对象time.http://msdn.microsoft.com/en-us/library/dd264736.aspx –

+0

我不认为动态是由官方驱动程序正确支持。我自己也在和这个问题作斗争,但是我得出的结论是我的文件并不像我想象的那样特殊。你能描述你有什么架构差异吗?或者仅仅是你的文件不平衡。不同之处在于模式差异意味着完全不同的结构(不同类型),而不均匀可能意味着存在稀疏文档。是否有可能描述超级文档是所有变体的超集?我也使用字典<,>大量用于完全可变的objs – cirrus

+0

问题是我只能定义第一级结构,而没有嵌套对象。原因是每个用户都可以定义他们自己的文档结构,并且会有几个“文档模板”的集合。所以强类型的对象绝对不在。我是C#的新手,但在我看来,字典也出来了,因为它仍然是结构化的。 –

回答

3

我不认为你得到的错误信息是来自C#驱动程序。你能否提供堆栈跟踪?

我试图重现您的问题,但它与我的测试程序正常工作。请参阅:

http://pastie.org/5032283

通过上面的测试程序中插入的文件看起来是这样的:

> db.test.find() 
{ "_id" : ObjectId("5075fc6ee447ad1354c1f018"), "name" : "John Doe", "sub" : { "x" : 1, "y" : 2 } } 
> 
+0

这就是浏览器错误:http:// pastie .org/5033511 –

+0

谢谢罗伯特!你是对的,问题不在于对类的反序列化,这很好,但可能是WebAPI的内容协商。如果我改变我的控制器返回一个字符串,而不是类,它的工作原理。我想api不能处理与BsonDocument类型的内容协商。我的新问题是,没有内容协商,我得到一个“双处理”json字符串,看起来像这样:“{\”_ id \“:ObjectId(\”50768abb1934070e98030647 \“),\” –

+0

将开始一个新的问题,我认为你迄今为止回答了它 –