【问题标题】:Return JSON from MongoDb without $date从没有 $date 的 MongoDb 返回 JSON
【发布时间】:2018-01-13 16:07:14
【问题描述】:

我在 WebApi 应用程序中使用带有 C# 的 MongoDb。由于所存储文档的动态特性,我的数据不能很好地适用于映射数据类型。例如,这里是一些数据的示例。请注意 Data 部分的值可以是数组或单个字符串 (Technician):

{
    "_id" : "5a59129d16d5c42f7444b83d",
    "CreatedDate" : "2018-01-09T20:30:19.455Z",
    "Data" : {
        "AlcoholTest" : [ 
            {
                "Technician" : [ 
                    "STT", 
                    "BAT"
                ],
                "TestReason" : "not well"
            }
        ]
    }
}

当我尝试像上面那样返回数据时,我得到了这个:

{
    "_id": {
        "$oid": "5a59129d16d5c42f7444b83d"
    },
    "CreatedDate": {
        "$date": 1515529819455
    },
    "Data": {
        "AlcoholTest": [
            {
                "Technician": [
                    "STT",
                    "BAT"
                ],
                "TestReason": "drunk"
            }
        ]
    }
}

这是我正在使用的代码:

public object FindById(string id)
{
    var filter = new BsonDocument { { "_id", ObjectId.Parse(id) } };
    var result = _collection2.Find(filter);
    var note = result.Any() ? result.First() : null;
    var json = note.ToJson(new JsonWriterSettings{OutputMode = JsonOutputMode.Strict});
    return JObject.Parse(json);
}

我不能只返回 note 对象,因为 Newtonsoft 不知道如何将这些 $data$oid 转换为有效类型并返回解析错误。

当我尝试在 .NET 中使用 MongoDb 映射类时,这就是我的类的样子(为简单起见,我不包括 BsonClassMap.RegisterClassMap 的东西):

public class Note
{
    public string Id { get; set; }
    public DateTime? CreatedDate { get; set; }
    public IDictionary<string, IList<IDictionary<string, object>>> Data { get; set; }
}

当我尝试这段代码时,Newtonsoft 不知道如何处理IList&lt;IDictionary&lt;string, object&gt;&gt; 中的object 可能是数组或字符串的情况,而是保存了一些相当讨厌的JArrayJObject 数据。

所以这是我的问题:

  • 有没有办法让上述 C# 代码返回与 Mongo 数据库中表示的 JSON 相同的 JSON(或 UI 发送并期望返回的 JSON)?
  • 或者有没有一种方法可以使用 .NET 类型映射我的 Data 文档,从而允许我使用接受字符串值、数组或两者的 MongoDb 映射类?

【问题讨论】:

标签: c# json mongodb json.net


【解决方案1】:

我最终使用了不同的方法来保存和获取。为了保存,我将一个通用对象转换为 BsonDocument,并将其保存为它。这导致了我期望的数据格式(我上面的问题的第一个数据格式)。

我使用强类型集合从 MongoDB 获取数据,因此可以避免上述问题中的第二种数据格式。为了以正确的格式返回数据,我将这个属性从

public IDictionary<string, IList<IDictionary<string, IList<string>>>> Data { get; set; }

public IDictionary<string, object> Data { get; set; }

这为我提供了我需要的正确格式的数据。拥有两个用于获取和保存的 MongoDb 集合并不理想,但它消除了我最初将字典 BsonDocument 解析为我的强类型 POCO 的技巧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 2017-08-04
    • 2016-02-01
    • 1970-01-01
    相关资源
    最近更新 更多