私の Web クライアントは 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をお願いします。