IEnumerable 在 Json.NET 中序列化为 [JsonObject],不使用属性

Posted

技术标签:

【中文标题】IEnumerable 在 Json.NET 中序列化为 [JsonObject],不使用属性【英文标题】:IEnumerable serialize as [JsonObject] in Json.NET, without using the attribute 【发布时间】:2022-01-19 12:07:09 【问题描述】:

我想将 IEnumerable 序列化为 JsonObject,就像通过应用 [JsonObject] 属性对其进行序列化的方式一样,但我无法通过引入此属性来更改 DTO 类。

有没有办法告诉(反)序列化器强制 JsonObject(反)序列化?

【问题讨论】:

请提供您的课程示例和您想要将其序列化为的 json 【参考方案1】:

是的,您可以使用自定义 IContractResolver 来执行此操作。您需要做的就是创建一个从 Json.Net 的DefaultContractResolver 派生的解析器类,并覆盖CreateContract(Type) 方法,如下所示,其中FooList 被替换为您的可枚举类型。

class CustomResolver : DefaultContractResolver

    protected override JsonContract CreateContract(Type type)
    
        if (type == typeof(FooList))
            return CreateObjectContract(typeof(FooList));

        return base.CreateContract(type);
    

将解析器添加到序列化器设置中,并在序列化时使用这些设置:

var settings = new JsonSerializerSettings

    ContractResolver = new CustomResolver(),
    Formatting = Formatting.Indented
;

string json = JsonConvert.SerializeObject(yourObject, settings);

这是一个演示:https://dotnetfiddle.net/ocyjU4

【讨论】:

非常酷,正是我所需要的。这个例子是正确的,我实际上想要一个带有额外元数据的列表来序列化为对象:-)

以上是关于IEnumerable 在 Json.NET 中序列化为 [JsonObject],不使用属性的主要内容,如果未能解决你的问题,请参考以下文章

.NET(C#) Json.Net(newtonsoft)使用LINQ查询JSON数据

Newtonsoft.Json Json.Net02.02序列化指引Serialization Guide

一:Newtonsoft.Json 支持序列化与反序列化的.net 对象类型;

手记走近科学之为什么JObject不能调用LINQ扩展方法

检查一个 IEnumerable 是不是包含另一个 IEnumerable 的所有元素

使用 WCF Web Api 大量返回动态类型/Expandos?