使用“多类型”属性序列化 Json 对象

The*_*One 8 c# json mongodb mongodb-.net-driver asp.net-core

我正在关注使用 ASP.NET Core 和 MongoDB教程创建 Web API

而且我缺少一些非常基本的东西,即如何序列化具有可能是“多类型”属性的 Json 对象。也就是说,这个属性可以是一个字符串,也可以是另一个对象。

这是教程中的原始 Json 示例:

{
  "_id" : ObjectId("5bfd996f7b8e48dc15ff215d"),
  "Name" : "Design Patterns",
  "Author" : "Ralph Johnson"
}
Run Code Online (Sandbox Code Playgroud)

这是教程中的原始 POCO 模型:

public class Book
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }

    [BsonElement("Name")]
    public string BookName { get; set; }
    public string Author { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我在 WebApi 控制器上调用“发布”和“获取”操作时,原始 Json 模型被正确序列化为 Book 实例,保存到数据库中并按预期从 Web 服务中正确检索。

但是,我需要添加一个“MultiUse”属性,其中MultiUse可以是字符串或对象,也可以是其他内容,例如:

{
 "_id" : ObjectId("5bfd996f7b8e48dc15ff215d"),
 "Name" : "Design Patterns",
 "Author" : "Ralph Johnson",
 "MultiUse": "Some String"
}
Run Code Online (Sandbox Code Playgroud)

或者

{
 "_id" : ObjectId("5bfd996f7b8e48dc15ff215d"),
 "Name" : "Design Patterns",
 "Author" : "Ralph Johnson",
 "MultiUse": {
     "foo":"bar"
  }
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试发布一个对象,这个MultiUse属性会被序列化为另一个 .Net 类型。

在此处输入图片说明

MultiUsePOCO模型中应该是什么类型?我已经尝试过Object, Dynamic, BsonDocument,但很明显我认为 AspNet 和 MongoDb 驱动程序不会在我需要时自动序列化它。

这个多值属性几乎是我想使用 MongoDB 的唯一原因,我只想将该属性中的任何内容保存到数据库中。

这种情况在 ExpressJS 中没有问题,但由于客户端要求,我需要 .Net。

当然,我可以删除强类型模式并使用 MongoDB 网络驱动程序函数在没有模型的情况下插入、更新和查询。但由于这“应该”是一个常见的场景,我只是想知道这是如何处理的。

小智 2

有多种方法可以解决这个问题,我的建议是导入Newtonsoft.Json,然后使用MultiUseas JObject,或者 if MultiUseis array as Jarray