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

Posted

技术标签:

【中文标题】使用“多类型”属性序列化 Json 对象【英文标题】:Serialize Json object with "multi-type" property 【发布时间】:2021-08-28 21:30:59 【问题描述】:

我正在关注Create a web API with ASP.NET Core and MongoDB 教程

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

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


  "_id" : ObjectId("5bfd996f7b8e48dc15ff215d"),
  "Name" : "Design Patterns",
  "Author" : "Ralph Johnson"

这是教程中的原始 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; 

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

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


 "_id" : ObjectId("5bfd996f7b8e48dc15ff215d"),
 "Name" : "Design Patterns",
 "Author" : "Ralph Johnson",
 "MultiUse": "Some String"


 "_id" : ObjectId("5bfd996f7b8e48dc15ff215d"),
 "Name" : "Design Patterns",
 "Author" : "Ralph Johnson",
 "MultiUse": 
     "foo":"bar"
  

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

MultiUse 在 POCO 模型中应该是什么类型?我试过ObjectDynamicBsonDocument,但很明显我认为 AspNet 和 MongoDb 驱动程序不会在我需要时自动序列化它。

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

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

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

【问题讨论】:

使用泛型能解决你的问题吗? 这有帮助吗:***.com/questions/59554853/… ? 如果类型是众所周知的,您可以在此处遵循多态性指南:mongodb.github.io/mongo-csharp-driver/2.0/reference/bson/… @user1344783 谢谢,MultiUse 类型未知 然后对 newtonsoft 使用 JObect 或对 System.Text.Json 使用 JElement 【参考方案1】:

有几种方法可以解决这个问题, 我的建议是导入Newtonsoft.Json,然后使用MultiUse 作为JObject,或者如果MultiUse 是数组作为Jarray

【讨论】:

如果使用核心,请确保使用核心版本。 Microsoft.AspNetCore.Mvc.NewtonsoftJson JObject 抛出 The JSON value could not be converted to Newtonsoft.Json.Linq.JObject @TheOne 尝试使用JToken 而不是JObject @GuruStron JSON 值无法转换为 Newtonsoft.Json.Linq.JToken

以上是关于使用“多类型”属性序列化 Json 对象的主要内容,如果未能解决你的问题,请参考以下文章

C# MongoDB 多类型序列化

Json 使用动态属性名称反序列化对象数组

使用嵌套对象中的属性反序列化 JSON [重复]

如何使用 Kotlin 序列化解析 JSON 对象列表中的第一个属性?

Newtonsoft 反序列化到对象存储底层 JSON 作为属性

如何不序列化 JSON 对象的 __type 属性