使用“多类型”属性序列化 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 模型中应该是什么类型?我试过Object
、Dynamic
、BsonDocument
,但很明显我认为 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 对象的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Kotlin 序列化解析 JSON 对象列表中的第一个属性?