【问题标题】:Deserialize Bson file反序列化 Bson 文件
【发布时间】:2014-12-03 10:49:26
【问题描述】:

我有一个使用 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 对象反序列化的集合类型(如数组或列表)。 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


【解决方案1】:

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

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

但是通过尝试反序列化为List&lt;&gt;,反序列化程序正在等待

[{
    "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 类型(例如,不是像整数这样的原始类型,不是像数组或列表这样的集合类型),可以从 JSON 对象反序列化。也可以将 JsonObjectAttribute 添加到类型中以强制它从 JSON 对象反序列化。

【讨论】:

  • 我没有说:该文件包含一个配置文件列表。当我使用 bsondump 查看其中的内容时,我有 {"foo": 1}{"foo":2} 等。但是没有根元素
  • @user3635728 请在您的问题中发布您要反序列化的 JSON 示例。
  • 好的,我会尽快做的。请注意,根据您的提示,我成功检索了列表的第一个元素
  • @user3635728 如果您的 JSON 看起来像这样{"foo":1}{"bar":2},那么听起来您的 JSON 无效。如果你有多个项目,它应该看起来像[{"foo":1},{"bar":2}]
  • 我同意你的观点,问题是我无法控制输入文件的生成方式。我想我可以以编程方式添加方括号...
【解决方案2】:

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

【讨论】:

  • 谢谢,但我试过了,它只允许我读取第一个元素。
猜你喜欢
  • 1970-01-01
  • 2011-09-02
  • 2016-02-14
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多