9

我正在使用 ASP.NET MVC 4 中的 API,我使用 MongoDB 作为后端。

由于 MongoDB 存储和返回 BSON 对象,而 MVC4 返回 JSON 对象,我认为在其余调用中简单地返回 BSON 会相当容易。

这没有用,所以我.toJson()在 thBsonDocument类上找到了方法,将 BSON 对象转换为 JSON 字符串表示。不幸的是,当我通过我的返回这个字符串时ApiController,MVC 显然认为它应该将字符串重新序列化为 JSON,浏览器无法解释。

所以我想问一下是否有办法禁用特定ApiController方法的JSON序列化?

我目前的解决方法是在返回.toJson()之前对返回的 JSON 进行反序列化,以便再次对其进行序列化,但这似乎相当浪费。

4

3 回答 3

2

我也遇到了这个问题,我获取了 Bson 数据,在 Web API 端迭代了将每个文档转换为 json,正如我假设你所做的那样,创建了一个 json 字符串列表 - 我将其发回并将每个字符串反序列化回布森文件:

List<string> data = response.Content.ReadAsAsync<List<string>>().Result;

List<BsonDocument> docList = new List<BsonDocument>();
foreach (string dataStr in data) {
    BsonDocument doc = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(dataStr);
    docList.Add(doc);                 
}

我在这篇文章中发现:将字符串转换为 MongoDB BsonDocument

位火腿吝啬,但它的工作原理。

于 2013-01-16T12:53:52.917 回答
1

大概您有一个与您的应用程序关联的架构以及您的 api 控制器试图返回的资源。通过强制它使用 json,您完全回避了内容协商,从而忽略了 WebApi 的许多好处。如果您的客户想要 xml 或 yaml 或...

您遇到的问题是 WebApi 不知道如何序列化 BsonDocument。因此,您可以为它编写一个 ModelBinder 以便它知道如何处理它。或者,暗指我的第一段,创建强类型实体/资源类,因为 MongoDB 和 WebApi 都已经知道这些类型,它们将能够在本地使用它们。

于 2012-09-19T12:50:34.137 回答
1

我面临同样的事情,想简化后端代码。

我发现对动态的支持从今年年初的驱动程序 v2.0 开始就可以工作了。只需BsonDocumentdynamic这样的关键字替换:

public async Task<dynamic> GetAll(string collectionName)
{
    //var collection = db.GetCollection<BsonDocument>(collectionName);
    //var result = await collection.Find(new BsonDocument()).ToListAsync();
    var collection = db.GetCollection<dynamic>(collectionName);
    return await collection.Find(new BsonDocument()).ToListAsync();
}

也用于插入:

var collection = db.GetCollection<dynamic>(collectionName);
await collection.InsertManyAsync(new List<dynamic>()
{
    new
    {
        PointType = "Building",
        Name = "My Place",
        Location = GeoJson.Point(GeoJson.Position(lng, lat))
    }
});

创建迁移脚本真的很有帮助。但是,不要接受dynamic来自客户网站的“任何东西”。

于 2015-08-31T11:05:33.387 回答