【发布时间】:2014-12-03 10:49:26
【问题描述】:
我有一个使用 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);
在 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"}
}
此外,如果我替换:
serializer.Deserialize<List<Json.Profil>>(reader);
通过
serializer.Deserialize<Json.Profil>(reader);
我不再得到异常,但我只检索集合的第一条记录。
【问题讨论】:
-
读取 bson 文件并且不仅获得第一个元素是否成功?我手头有同样的问题,无论我做什么(Newtonsoft、MongoDB,甚至是在线 bson => json 转换器)都只能让我获得第一个元素。
-
已经有一段时间了,但我记得我最终通过解决方法解决了我的问题:如果您可以修改 json 文件,请将集合放在根元素下。这样,在反序列化文件时,您将获得根,即第一个元素。然后你只需要探索它的孩子。希望这会有所帮助。
-
嘿Mjollnir,感谢您的回复!不幸的是,我只是将 bson 文件作为 MongoDB 的转储文件并想要获取数据。那就需要另辟蹊径了...
标签: c# json mongodb serialization