c# MongoClient可以在不序列化为.net类型的情况下返回有效的JSON吗?
本文关键字:返回 情况下 有效 JSON 类型 net MongoClient 序列化 | 更新日期: 2023-09-27 18:19:07
我想有ASP。.NET MVC返回作为JSON存储在MongoDB中的文档,但不需要首先将其序列化为。NET类型。然而,BSONDocument.ToJSON()返回的JSON看起来像这样:
{_id:ObjectId("someid")}
浏览器的JSON解析器不喜欢"ObjectId(nnn)",因此调用失败并出现解析器错误。我能够使用Regex hack获得可解析的JSON:
public ActionResult GetFormDefinitionsJSON()
{
var client = new MongoDB.Driver.MongoClient(ConfigurationManager.ConnectionStrings["mongodb"].ConnectionString);
var db = client.GetServer().GetDatabase("formthing");
var result = db.GetCollection("formdefinitions").FindAll().ToArray();
var sb = new StringBuilder();
sb.Append("[");
var regex = new Regex(@"(ObjectId'()(.*)('))");
var all = result.Select(x => regex.Replace(x.ToJson(), "$2"));
sb.Append(string.Join(",", all));
sb.Append("]");
return Content(sb.ToString(), "application/json");
}
返回可解析的JSON:
{_id:"someid"}
但是它有味道。有没有办法没有正则表达式和字符串构建hackery获得官方MongoDB驱动程序返回JSON,可以由浏览器解析?或者,我错过的东西在浏览器端,将允许{_id:ObjectId("someid")}被解析为有效?
我能想到你有两个选择。
第一个是使用JavaScript JsonOutputMode
模式。这导致ID序列化为"_id" : { "$oid" : "51cc69b31ad71706e4c9c14c" }
-不是很理想,但至少它是有效的Javascript Json。
result.ToJson(new JsonWriterSettings { OutputMode = JsonOutputMode.JavaScript })
另一个选择是序列化你的结果到一个对象,并使用[BsonRepresentation(BsonType.String)]
属性。这将产生更好的Json: "_id" : "51cc6a361ad7172f60143d97"
;但是,它需要您定义一个类来将其序列化(这会影响性能)
class Example
{
[BsonId]
[BsonRepresentation(BsonType.String)]
public ObjectId ID { get; set; }
public string EmailAddress { get; set; }
}
// Elsewhere in Code - nb you need to use the GetCollection<T> method so
// that your result gets serialized
var result = database.GetCollection<Example>("users").FindAll().ToArray();
var json = result.ToJson();
关于JsonOuputModes (Strict, javascript和Mongo)之间差异的更多细节:
http://docs.mongodb.org/manual/reference/mongodb-extended-json/