如何在 Json.NET 中使用 JsonSerializerSettings 在属性中指定时禁用 TypeNameHandling?

2023-12-28

有时我需要抑制输出"$type"即使由 Json.NET 指定属性JsonPropertyAttribute.ItemTypeNameHandling https://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_JsonPropertyAttribute_ItemTypeNameHandling.htm。如何才能做到这一点?

我的根类如下所示:

public class DomainResource
{
    [JsonProperty(ItemTypeNameHandling = TypeNameHandling.Auto)]
    public List<Extension> Extensions { get; set; }
}

另外我还有一个类层次结构Extension例如以下内容:

public class Extension
{
    readonly string url;

    public string Url { get { return url; } }

    public Extension(string url)
    {
        this.url = url;
    }
}

public class IntegerExtension : Extension
{
    public IntegerExtension(string url) : base(url) { }

    [JsonProperty("ValueInteger")]
    public int Value { get; set; }
}

我想忽略ItemTypeNameHandling在序列化过程中的某些情况下,但我无法找到一种方法来做到这一点。 当我不想要时,我尝试使用 TypeNameHandling.None 设置 JsonSerializerSettings 作为 jsonconvert 的输入"$type"使用以下代码的属性:

public static string SerializeObject(object value)
{
    JsonSerializerSettings jsonSettings = new JsonSerializerSettings
    {
        ContractResolver = new CamelCasePropertyNamesContractResolver(),
        NullValueHandling = NullValueHandling.Ignore,
        TypeNameHandling = TypeNameHandling.None,

    };
    jsonSettings.Converters.Add(new StringEnumConverter
    {
        CamelCaseText = true
    });
    return JsonConvert.SerializeObject(value, Formatting.None, jsonSettings);
}

然后使用它如下:

var res = new DomainResource();
res.Extensions = new List<Extension>();
res.Extensions.Add(new IntegerExtension("ewwer"){Value = 3});

var x = CustomJsonConvert.SerializeObject(res);

我想要的 JSON 是:

{"extensions":[{"valueInteger":3,"url":"ewwer"}]}

但它包含"$type"属性如下图:

{“扩展”:[{“$ type”:“DicomtoJsonConverter.IntegerExtension, DicomtoJsonConverter","valueInteger":3,"url":"ewwer"}]}

我怎样才能抑制输出"$type"特性不改变DomainResource class?


您可以使用custom ContractResolver https://www.newtonsoft.com/json/help/html/contractresolver.htm#CustomIContractResolverExamples即使由指定也抑制类型信息的输出JsonPropertyAttribute.TypeNameHandling https://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_JsonPropertyAttribute_TypeNameHandling.htm, JsonPropertyAttribute.ItemTypeNameHandling https://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_JsonPropertyAttribute_ItemTypeNameHandling.htm or JsonContainerAttribute.ItemTypeNameHandling https://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_JsonContainerAttribute_ItemTypeNameHandling.htm。首先,定义以下合约解析器:

public class NoTypeNameHandlingContractResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        var property = base.CreateProperty(member, memberSerialization);
        // Suppress JsonPropertyAttribute.TypeNameHandling
        property.TypeNameHandling = null;
        // Suppress JsonPropertyAttribute.ItemTypeNameHandling
        property.ItemTypeNameHandling = null;
        return property;
    }

    protected override JsonContract CreateContract(Type objectType)
    {
        var contract = base.CreateContract(objectType);
        if (contract is JsonContainerContract)
        {
            // Suppress JsonContainerAttribute.ItemTypeNameHandling
            ((JsonContainerContract)contract).ItemTypeNameHandling = null;
        }
        return contract;
    }
}

然后,修改CustomJsonConvert.SerializeObject()如下:

public static class CustomJsonConvert
{
    // You may want to cache the contract resolver for best performance, see
    // https://stackoverflow.com/questions/33557737/does-json-net-cache-types-serialization-information
    static readonly JsonSerializerSettings jsonSettings;
    static CustomJsonConvert()
    {
        jsonSettings = new JsonSerializerSettings
        {
            ContractResolver = new NoTypeNameHandlingContractResolver
            {
                NamingStrategy = new CamelCaseNamingStrategy
                {
                    // These are the settings used by CamelCasePropertyNamesContractResolver by default.
                    // Change them if this is not what you want.
                    OverrideSpecifiedNames = true,
                    ProcessDictionaryKeys = true,
                },
            },
            NullValueHandling = NullValueHandling.Ignore,
            TypeNameHandling = TypeNameHandling.None,
            Converters = { new StringEnumConverter { CamelCaseText = true } },
        };
    }

    public static string SerializeObject(object value)
    {
        return JsonConvert.SerializeObject(value, Formatting.None, jsonSettings);
    }
}

如果您使用的 Json.NET 版本早于9.0.1 https://github.com/JamesNK/Newtonsoft.Json/releases/tag/9.0.1你需要子类化CamelCasePropertyNamesContractResolver而不是子类化DefaultContractResolver since NamingStrategy https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Serialization_NamingStrategy.htm是在该版本中引入的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Json.NET 中使用 JsonSerializerSettings 在属性中指定时禁用 TypeNameHandling? 的相关文章

  • Windows 10 UWP 中的视觉状态管理器未在页面加载时应用初始状态

    我有一个带有相关面板的页面 可以根据宽度重新组织 但是 除非宽度 gt 720px 否则它似乎不会在加载时应用任何状态 如果我在加载页面后调整页面大小 则两种状态都有效 解决方法是检查加载页面上的窗口大小并手动选择状态 但我相信这应该自动处
  • 无法在表适配器配置属性中找到对象“Web.config”的连接“MyConnName”

    I want to change the query in table adapter but it s not opening throwing an error Configure table Adapter Failed in pro
  • 为什么在 OpenCV 中访问该矩阵时出现内存错误?

    我只是想写入给定大小的矩阵 当我在 Valgrind 中运行该程序时 出现内存错误 如下所示 主要 cpp include
  • 将 RequestBody json 转换为对象 - Spring Boot

    我是 java 开发的初学者 但之前有 PHP 和 Python 等编程语言的经验 对于如何进行 Spring Boot 的开发几乎没有什么困惑 我正在开发一个rest API 它有以下请求 key value key1 value1 pl
  • 如何在Qt中更快地读取数据?

    Qt读取数据库比C 慢吗 我想我错过了一些东西 为了比较阅读速度 我在 Qt 中编写了以下内容 QElapsedTimer t t start int count 0 QString cs Driver SQL Server Server
  • 如何自定义 ASP.Net Core 模型绑定错误?

    我只想从我的 Web API Asp net Core 2 1 返回标准化的错误响应 但我似乎不知道如何处理模型绑定错误 该项目刚刚从 ASP NET Core Web 应用程序 gt API 模板创建 我有一个简单的操作定义为 Route
  • 我可以将特定警告视为错误吗?

    以下是我有时在学生代码中看到的模式的简化版本 bool foobar int a int b if a lt b return true 当然 真正的代码要复杂得多 Visual Studio 报告警告 C4715 并非所有控制路径都会返回
  • Newtonsoft JSON.Net SelectToken 问题

    我有以下查询和示例 JSON 我试穿一下 http jsonpath com http jsonpath com 它按预期工作 如果我在 VisualStudio 中尝试它 它不会返回任何结果 Items Services Name Ano
  • 解码Json数据数组并插入到mysql

    这个问题可能已经在这里问过 但我尝试搜索找不到它 我有如下 Json 数据 CityInfo CityCode 5599 Name DRUSKININKAI CityCode 2003 Name KAUNAS CityCode 2573 N
  • Math.Sin、Math.Cos 和 Math.Tan 精度以及正确显示它们的方法

    我正在用 C 编写一个计算器 textBoxResult是一个文本框 我在其中显示数字 recount是以度为单位获取角度并以弧度为单位返回的函数 我的角度是从texBoxInput public double recount int nu
  • 二维数组的列求和

    我有一个IEnumerable
  • C++ 虚拟关键字与重写函数

    我正在学习c 并且正在学习virtual关键字 我在互联网上搜索试图理解它但无济于事 我进入编辑器并做了以下实验 期望它打印两次基本消息 因为我的印象是需要 virtual 关键字来覆盖函数 然而 它打印出了两条不同的消息 有人可以向我解释
  • Ajax 函数在重定向后不保存滚动位置

    正如标题所述 我编写了一个 ajax 函数 该函数应该滚动到用户在重定向之前所在的位置 我写了一个alert对于测试场景 它确实触发了 但滚动不断回到顶部 我在这里做错了什么 JavaScript ajax type GET url Adm
  • 为什么 C++20 范围不只提供管道语法?

    我知道这个问题听起来很奇怪 所以这里有一些背景信息 最近 我很失望地了解到 C 20 范围内的映射缩减并不像人们所期望的那样工作 即 const double val data transform accumulate 不起作用 你必须这样
  • 函数中的重复参数检查

    我经常有调用层次结构 因为所有方法都需要相同的参数 如果我不想将它们放在实例级别 类的成员 那么我总是问我在每个方法中检查它们的有效性是否有意义 例如 public void MethodA object o if null o throw
  • 如何从 Function App 设置会话 ID 或创建自定义字段到 Application Insights

    功能应用程序如下 public static async Task
  • 更改成员资格、角色等的默认连接字符串

    默认情况下 我的网络应用程序似乎正在使用LocalSqlServer作为用于任何应用程序服务 例如成员资格 角色 身份验证 等 的连接字符串 有什么方法可以更改默认连接字符串应该是什么 默认值是 LocalSqlServer 似乎很随意 我
  • 使用 Node.js 访问用 C++ 编写的 SDK

    我有一个用 C 语言编写的 SDK 可以与我的扫描仪设备进行通信 我需要开发一个可以访问扫描仪设备的电子应用程序 我知道有很多库可用于扫描仪 但我想使用这个 SDK 因为它允许我访问设备的完整功能 而且它是由设备制造商提供的 那么 有没有什
  • 使用 Crypto++ 和 .NET 的 CFB 模式下的 TripleDES

    我正在尝试使用 TripleDES 使用 C 应用程序获得相同的结果 该应用程序具有Crypto https www cryptopp com 和 NET应用程序使用三重DESCryptoServiceProvider https msdn
  • 频繁插入已排序的集合

    我已经对集合 列表 进行了排序 并且我需要始终保持其排序 我目前在我的集合上使用 List BinarySearch 然后在正确的位置插入元素 我也尝试过在每次插入后对列表进行排序 但性能不可接受 有没有一种解决方案可以提供更好的性能 也许

随机推荐

  • 更改 MailChimp 的成功/错误消息

    我在任何地方都找不到这个 熟悉 MailChimp 的人可以提供建议吗 我已经嵌入了我的表单 输入 并且有一些空的 div 如下 其中注入了错误 成功消息 div class clear div class response style d
  • 使用 Mailgun 和 NodeMailer 包发送电子邮件

    几天前 我意识到谷歌已经改变了 Gmail 帐户的安全性 特别是从应用程序发送电子邮件的可能性 在谷歌搜索了一段时间后 我找不到解决办法 所以 我求助于 Mailgun 我创建了一个帐户并启用了业务验证 但是 我仍然无法发送电子邮件 我不断
  • 如何过滤掉 Base36 ID 中的脏话?

    我想在我正在开发的 Web 应用程序中使用 base36 但由于 id 作为 url 对用户可见 所以我想过滤掉脏话 有人解决这个问题了吗 或者这真的是一个问题吗 仅跳过数据库序列中的数字有意义吗 好吧 与其尝试收集所有可能的脏话 不如过滤
  • Javascript argument.sort() 抛出错误排序不是函数

    只是想知道为什么我在使用以下简单的 JavaScript 函数时遇到错误 function highest return arguments sort function a b return b a highest 1 1 2 3 错误消息
  • 给定一个字符串,仅在一次扫描中找到其第一个非重复字符

    给定一个字符串 找到其中第一个不重复的字符 为了 例如 如果输入字符串是 GeeksforGeeks 那么输出应该是 F 我们可以使用字符串字符作为索引并构建一个计数数组 以下是算法 从左到右扫描字符串并构造计数数组或 哈希映射 再次从左到
  • $_SESSION 变量需要 mysql_real_escape_string() 吗?

    我应该使用mysql real escape string 我的 MySQL 查询中的函数 SESSION变量 理论上 SESSION与以下不同 最终用户无法修改变量 GET or POST变量对吗 谢谢 不管用户是否可以修改数据 您可能都
  • 如何在 pyplot 中以对数比例绘制 secondary_y

    我想在一个图中有两条线 或更好的散点图 辅助 Y 线应采用对数刻度 如何使用 python matplotlib 做到这一点 您可以使用以下命令创建第二个 y 轴ax2 ax twinx 然后 正如 tacaswell 在评论中指出的那样
  • 在 Visual Studio 解决方案资源管理器中标记或突出显示文件

    是否有一个插件允许我在 Visual Studio 中标记或标记文件 然后这些文件会以视觉方式突出显示 例如不同的背景颜色 我搜索了 Visual Studio Gallery 但没有找到任何东西 Thanks 要仅突出显示解决方案资源管理
  • mysql TIME_WAIT;连接数过多问题

    当我在现场检查 mysql 加载时间时 我得到的结果显示连接为 TIME WAIT 即使我关闭了每个页面上的连接 有时网站无法加载 表示连接太多 有什么办法可以解决这个问题 预先感谢您的任何回复或建议 如果客户端连接到 MySQL 服务器
  • 使用 imshow 打印一种颜色 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我想使用 RGB 值在屏幕上打印颜色 并且输出应该只是单一颜色 例如 如果我给出红色的 RGB 值 我希望输出显示红色
  • 如何在 Keras 中使用 model.reset_states() ?

    我有顺序数据 并且声明了一个 LSTM 模型来预测y with x在喀拉斯 所以如果我打电话model predict x1 and model predict x2 调用是否正确model reset states两者之间predict
  • 如何使用 SwiftUI 在视图上检测向上、向下、向左和向右滑动

    我正在着手构建 Apple Watch 应用 我目前正在做的工作将要求我利用检测四个主要方向的滑动 UP DOWN LEFT and RIGHT 问题是我不知道如何检测到这一点 我环顾四周 发现自己走进了死胡同 我可以对下面的视图做什么才能
  • JQuery UI 翻转文本,就像gumroad.com [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我试图在我
  • 在 Chapel 文件中包含第二个源文件

    在 C 中 当我需要 actions cpp 中的类时classes cpp我包括标题 例如 include
  • 如何读取和遍历 inode

    我已经在 EXT2 文件系统中打开了超级块和组描述符 但我不知道如何读取根目录或其中的文件 这是我得到的一些内容 fd open dev sdb2 O RDONLY lseek fd SuperSize SEEK SET read fd s
  • 创建一个可以在 React 上拖放列和行的表格

    我想创建一个可以在 React 上拖放列和行的表格 我看过其他解决方案 例如反应美丽 dnd https github com atlassian react beautiful dnd 表格拖动器 https github com sin
  • 如何从非组件辅助函数访问 redux 的存储?

    我有一个辅助函数 当我想从 Redux 存储中删除某些内容时 我会调用它 但是 我需要能够访问函数内的当前存储 以确定下一步要做什么 这就是我想做的 export function deleteDocument id this props
  • 如何制作自己的 P2P 软件? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我怎样才能制作自己的napster 这些 p2p 程序使用哪个库 我不太熟悉套接字编程的概念 你能用Qt4制作p2p程序吗 从 Napst
  • Instagram 风格的多媒体列表视图

    我尝试过搜索但没有找到明确的答案 我想知道创建一个列表视图的最佳方法 该列表视图可以使用媒体控制器显示音频 视频视图项目 用户可以为每个项目播放 暂停等 我认为实现纹理视图将是前进的方向 我相信视频视图与滚动视图不能很好地配合 但我不确定从
  • 如何在 Json.NET 中使用 JsonSerializerSettings 在属性中指定时禁用 TypeNameHandling?

    有时我需要抑制输出 type 即使由 Json NET 指定属性JsonPropertyAttribute ItemTypeNameHandling https www newtonsoft com json help html P New