反序列化Bson文件

时间:2014-12-03 10:49:26

标签: c# json mongodb serialization

我有一个用mongodump工具生成的Bson文件。我想在C#代码中反序列化。为此,似乎我可以使用mongodb C#驱动程序或Json.net库。 我尝试了他们两个,但我不能让他们工作。

使用Json.net库: “input”是Bso​​n文件的路径

JsonSerializer serializer = new JsonSerializer();
BsonReader reader = new BsonReader(File.OpenRead(input));
serializer.Deserialize<List<Json.Profil>>(reader);

在Deserialize()上,我得到以下异常:

无法将当前JSON对象(例如{“name”:“value”})反序列化为类型'System.Collections.Generic.List`1 [MoulinetteConsole.Json.Profil]',因为该类型需要JSON数组(例如[1,2,3])正确反序列化。

要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])或更改反序列化类型,使其成为普通的.NET类型(例如,不是像整数这样的基本类型,而不是可以从JSON对象反序列化的集合类型,如数组或List)。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。

[编辑] 如果使用工具bsondump将bson导出到json文件,我得到:

{ "id" : "1",
  "value" : { "foo" : null, "bar" : "test"}
}
{ "id" : "2",
  "value" : { "foo" : null, "bar" : "test"}
}

此外,如果我更换:

serializer.Deserialize<List<Json.Profil>>(reader);

通过

serializer.Deserialize<Json.Profil>(reader);

我不再获得异常,但我只检索该集合的第一条记录。

2 个答案:

答案 0 :(得分:0)

您的文件可能包含看起来像这样的Json

{
    "foo":1,
    "bar":"baz"
}

但是通过尝试反序列化为List<>,反序列化器期待

[{
    "foo":1,
    "bar":"baz"
},
{
    "foo":2,
    "bar":"baz"
},
...]

只需将反序列化行更改为:

serializer.Deserialize<Json.Profil>(reader);

应该有用。

这就是错误告诉你的:

  

无法将当前JSON对象(例如{“name”:“value”})反序列化为类型'System.Collections.Generic.List`1 [MoulinetteConsole.Json.Profil]',因为该类型需要JSON数组(例如[1,2,3])正确反序列化。

     

修复此错误要么将JSON更改为JSON数组(例如[1,2,3]),要么更改反序列化类型以使其成为正常的.NET类型< / strong>(例如,不是像整数这样的基本类型,不是像数组或List 那样的集合类型),可以从JSON对象反序列化。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。

答案 1 :(得分:0)

尝试设置BSON Reader的属性 - ReadRootValueAsArray = true