我的网络客户端发送 Json。MongoDB 实际上是 Json。这应该很容易,但我在与 MVC3 中的 C# 驱动程序作斗争时陷入困境。似乎没有简单的方法可以避免在 C# 类中工作。我原以为只需通过一点过滤来来回传递 Json 就很容易了。就像我在和一个 ORM 战斗,我不想这样。
无论如何,我(不情愿地)用 C# 构建了我的数据模型,我使用的是 Json.Net,我的序列化代码看起来像;
我的 JsonResult 序列化代码是;
public override void ExecuteResult(ControllerContext context)
{
...
var serializedObject = JsonConvert.SerializeObject(Data, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
}
如果没有对象映射,我一生都无法弄清楚如何做到这一点。因此,我有一个控制器动作;
public JsonResult test()
{
var col = _db.GetCollection<Project>("myCollection");
var jsText = System.IO.File.ReadAllText(System.IO.Path.Combine(HttpContext.Server.MapPath("~/Controllers"), "MapReducers.js"));
string map_cashflow = new Regex(@"//function map_cashflow(.*?)//end", RegexOptions.Singleline).Match(jsText).Captures[0].ToString();
string reduce_cashflow = new Regex(@"//function reduce_cashflow(.*?)//end", RegexOptions.Singleline).Match(jsText).Captures[0].ToString();
var mr = col.MapReduce(map_cashflow, reduce_cashflow);
return Json(mr, JsonRequestBehavior.AllowGet);
}
现在,当我在其他地方(出于某种原因)序列化游标时,这可以工作,但我现在明白上面的失败是因为它试图序列化实际的 BsonDocument 而不是底层数据。当它尝试将第一个字段序列化为其他类型时出现错误,通常尝试将字符串或日期转换为 AsBoolean()。遗憾的是,驱动程序不能更轻松地对文档进行序列化。
我在尝试使用 BsonDocument 来表示我的对象图的动态部分时遇到了类似的麻烦。我认为这比 json 字符串更好,但它当然不会序列化。我最终使用 Dictionary<> 这很好。
我也试过这些,结果相似;
return Json(mr.GetResults());
return Json(mr.GetResults()).ToArray();
所以我也尝试了以下我看到人们成功的方法;
var jsonText = mr.ToJson(); // empty
var jsonText = mr.GetResults().toJson(); // Exception: No serializer found for type System.Collections.IEnumerator.
我想做的就是把看起来几乎完全像 Json 的东西扔回去,但我不知道如何序列化它。这是唯一的方法吗?
var resultsObj = mr.GetResultsAs<ResultsClass>();
如果是这样,那就糟了。我不想仅仅为了存放结果文档而构建静态类型的类。ORM 疯了!我不需要进出 C# 对象,驱动程序确实更像是一个障碍而不是帮助。我想我宁愿只拥有Json。