反序列化Bson文件

Mjo*_*nir 5 c# serialization json mongodb

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

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

JsonSerializer serializer = new JsonSerializer();
BsonReader reader = new BsonReader(File.OpenRead(input));
serializer.Deserialize<List<Json.Profil>>(reader);
Run Code Online (Sandbox Code Playgroud)

在 Deserialize() 上,出现以下异常:

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

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

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

{ "id" : "1",
  "value" : { "foo" : null, "bar" : "test"}
}
{ "id" : "2",
  "value" : { "foo" : null, "bar" : "test"}
}
Run Code Online (Sandbox Code Playgroud)

此外,如果我替换:

serializer.Deserialize<List<Json.Profil>>(reader);
Run Code Online (Sandbox Code Playgroud)

经过

serializer.Deserialize<Json.Profil>(reader);
Run Code Online (Sandbox Code Playgroud)

我不再遇到异常,但我只检索集合的第一条记录。

dav*_*v_i 0

您的文件可能包含如下所示的 Json

{
    "foo":1,
    "bar":"baz"
}
Run Code Online (Sandbox Code Playgroud)

但通过尝试反序列化List<>,反序列化器期望

[{
    "foo":1,
    "bar":"baz"
},
{
    "foo":2,
    "bar":"baz"
},
...]
Run Code Online (Sandbox Code Playgroud)

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

serializer.Deserialize<Json.Profil>(reader);
Run Code Online (Sandbox Code Playgroud)

应该管用。

这就是错误告诉您的内容:

无法将当前 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 对象反序列化。