使用JsonConvert.DeserializeObject注意事项

2023-11-15

在使用JsonConvert.DeserializeObject反序列化自定义对象的时候,我遇到了一个问题。定义了一个对象QueryModel,QueryModel拥有两个构造方法,私有无参构造方法(private QueryModel())跟一个公共构造方法(public QueryModel(String queryModel))。

public class QueryModel
{
    private QueryModel()
    {
        this.Params = new Hashtable();
    }

    public QueryModel(String queryModel)
    {
        QueryModel qm = new QueryModel();
        try
        {
            qm = JsonConvert.DeserializeObject<QueryModel>(queryModel);
        }
        catch (System.Exception ex)
        {
            throw ex;
        }
        this.Params = qm.Params;
    }

    public Hashtable Params { get; set; }
}

但是当在外部调用

new QueryModel(queryModel)

时会重复调用两次构造方法。第一次传入参数是null,第二次才是正常传入的参数。这是为什么呢?
  在多次调试代码后,我发现在执行JsonConvert.DeserializeObject的时候会先调用一次构造方法。

  经过对Json反序列化的思考。我猜测应该是 JsonConvert.DeserializeObject 内部实现的时候先实例化了一个对象。然后通过反射对Json字符串中的各个属性对对象进行赋值。
  因为在外部实例化对象,所以构造方法必须是public的才会被调用,如果没有无参构造方法,JsonConvert.DeserializeObject 则选用带参数的公共构造方法提供默认参数,以完成实例化。
当然,这个只是我的猜测,具体没有研究过源码。若是有兴趣的同学,可以研究下 JsonConvert 的源码。

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

使用JsonConvert.DeserializeObject注意事项 的相关文章

  • 分段错误(核心转储)错误

    我的程序编译罚款 但在输入文件时出现 分段错误 核心转储 错误 我没有正确处理 ostream 吗 include
  • 在 C# 中生成 HMAC-SHA1

    我正在尝试使用 C 来使用 REST API API 创建者提供了以下用于 hmac 创建的伪代码 var key1 sha1 body var key2 key1 SECRET KEY var key3 sha1 key2 var sig
  • 如何尝试/捕获所有异常

    我正在完成由其他人启动的 UWP 应用程序 该应用程序经常崩溃 我总是陷入困境应用程序 at if global System Diagnostics Debugger IsAttached global System Diagnostic
  • (const T v) 在 C 中从来都不是必需的,对吗?

    例如 void func const int i 在这里 const是不必要的 因为所有参数都是按值传递的 包括指针 真的吗 C 中的所有参数确实都是按值传递 这意味着无论您是否包含该参数 实际参数都不会改变const or not 然而
  • CultureInfo 的实例(来自相同的文化)根据操作系统而变化

    我有一个网站 上面写着这样的日期 CultureInfo cultureInfo CultureInfo GetCultures CultureTypes AllCultures FirstOrDefault c gt string Equ
  • mprotect 之后 malloc 导致分段错误

    在使用 mprotect 保护内存区域后第一次调用 malloc 时 我遇到分段错误 这是执行内存分配和保护的代码片段 define PAGESIZE 4096 void paalloc int size Allocates and ali
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • 对 boost 库的依赖项没有完整路径

    我已经成功构建了动态库 依赖于使用自定义前缀构建和安装的 boost 库 b2 install prefix PREFIX 然而 当我跑步时otool L在我的库中 我得到如下输出 libboost regex dylib compatib
  • HttpWebRequest vs Webclient(特殊场景)

    我知道这个问题之前已经回答过thread https stackoverflow com questions 1694388 webclient vs httpwebrequest httpwebresponse 但我似乎找不到详细信息 在
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw
  • 从成员函数指针类型生成函子

    我正在尝试简化 通过make fn 预处理参数的函子的生成 通过wrap 对于 arity 的成员函数n 生成函子基本上可以工作 但到目前为止只能通过显式指定成员函数的参数类型来实现 现在我想从它处理的成员函数类型生成正确的函子 struc
  • 2D morton 码编码/解码 64 位

    如何将给定 x y 的莫顿代码 z 顺序 编码 解码为 32 位无符号整数 生成 64 位莫顿代码 反之亦然 我确实有 xy2d 和 d2xy 但仅适用于 16 位宽的坐标 产生 32 位莫顿数 在网上查了很多 但没有找到 请帮忙 如果您可
  • 为什么 clang 使用 -O0 生成低效的 asm(对于这个简单的浮点和)?

    我正在 llvm clang Apple LLVM 版本 8 0 0 clang 800 0 42 1 上反汇编此代码 int main float a 0 151234 float b 0 2 float c a b printf f c
  • C++ 错误 - “成员初始值设定项表达式列表被视为复合表达式”

    我收到一个我不熟悉的 C 编译器错误 可能是一个非常愚蠢的错误 但我不能完全指出它 Error test cpp 27 error member initializer expression list treated as compound
  • tabcontrol selectedindex 更改事件未被触发 C#

    嘿伙计们 我有一个很小的问题 请参阅下面的代码 this is main load private void Form1 Load object sender EventArgs e tabAddRemoveOperator Selecte
  • .NET 客户端中 Google 表格中的条件格式请求

    我知道如何在 Google Sheets API 中对值和其他格式进行批量电子表格更新请求 但条件格式似乎有所不同 我已正确设置请求 AddConditionalFormatRuleRequest formatRequest new Add
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • 为什么 Linux 对目录使用 getdents() 而不是 read()?

    我浏览 K R C 时注意到 为了读取目录中的条目 他们使用了 while read dp gt fd char dirbuf sizeof dirbuf sizeof dirbuf code Where dirbuf是系统特定的目录结构
  • OSError: [WinError 193] %1 不是有效的 Win32 应用程序,同时使用 CTypes 在 python 中读取自定义 DLL

    我正在尝试编写用 python 封装 C 库的代码 我计划使用 CTypes 来完成此操作 并使用 Visual Studio 来编译我的 DLL 我从一个简单的函数开始 在 Visual Studio 内的标头中添加了以下内容 然后将其构

随机推荐

  • idea中 mybatis 的 mapper.xml 新建没有 头文件

    idea中 mybatis 的 mapper xml 新建没有 头文件 解决步骤 1 直接 settings 2 直接 选择 MybatisMapper 添加
  • C6678多核DSP开发——image_processing例程

    前言 这篇学习笔记记录了在DSP上实现简单图像处理算法的image processing例程 该例程在CCS安装时安装在目录下 主要实现了对图像的分割 灰度处理以及边缘检测 学会了调用和修改DSP例程以及图像处理基本程序框架 1 打开CCS
  • iOS 的 APP 在系统中如何适应 iPhone 5s/6/6 Plus 三种屏幕的尺寸?

    iOS 的 APP 在系统中如何适应 iPhone 5s 6 6 Plus 三种屏幕的尺寸 iOS开发如何标准化的适应新的iPhone 5s iPhone6 6 Plus 是否有一种一劳永逸的解决方法 而不需要设计师针对不同的尺寸单独进行设
  • 基础算法题——炎炎消防队(取巧、三分)

    炎炎夏日 题目描述 夏天的重庆格外地炎热 很容易起火 消防士们都全副武装 一旦发生险情就立马赶往救火 森罗是消防队中的一员 他在灭火的过程中突发奇想 如果能用退火的原理求解函数求最小值 那不就可以很容易计算了吗 翌日 森罗来到即将高考的弟弟
  • Android中如何重新启动应用APP或重启系统

    重新启动应 程序 有两种 法 分别是 1 通过ActivityManager来重新启动应 程序 java 代码 ActivityManager manager ActivityManager this getSystemService Co
  • pm grant 命令

    CustomLocale apk所需要的权限 android permission CHANGE CONFIGURATION 自Android 4 2 4 2 2起系统定义为android protectionLevel signature
  • java学习笔记——众筹项目练习——前台系统的实名认证功能、ajax发送跨域请求、后台manager系统的实名认证人工审核

    实名认证功能 前面的文章中我们实现了后台manager系统中的流程管理功能 并且将实名认证的流程上传到了服务器并完成部署 不过 仅仅是长传和部署当然不是我们的目的啦 我们上传这个实名认证流程时为了可以让前台的广大用户可以使用这个流程 怎么才
  • C++ Primer 第五章 Statements

    C Primer 第五章 Statements 5 3 Conditional Statements 5 3 2 The switch Statement 5 4 Iterative Statements 5 4 3 Range for S
  • VScode 运行java出现exited with code=1 in 0.695 seconds的问题解决

    在运行vs中Java代码时 配置过程中可能会出现一些问题 导致运行结果为上述所示 在vs中运行Java代码时 首先要确保Java环境配置无误 出现下面的则证明配置成功 之后需要安装几个插件 最后就可以在vs中编写Java代码了
  • 使用C++调用C#的DLL

    SwfDotNet是C 编写的 作者的C 水平 真是令我佩服 这是个特别好的读写Swf文件的库 但是 我要用在C 项目中 怎么让C 调用C 的DLL呢 今天一上午都在琢磨这个问题 耽误了很多时间 原因是编译是出现 warning C4819
  • LeetCode题目笔记——389. 找不同/Python/C++

    文章目录 题目描述 题目难度 简单 方法一 使用哈希表计数出现次数 代码 Python 方法二 利用字母的ASCII码 代码 C Python 方法三 位运算 总结 题目描述 给定两个字符串 s 和 t 它们只包含小写字母 字符串 t 由字
  • thttpd嵌入式www服务工具的使用

    thttpd是一个非常小巧的轻量级web server 它非常简单 仅仅提供了HTTP 1 1和简单的CGI支持 在其官方网站上有一个与其他web server 如Apache Zeus等 的对比图 Benchmark 可以参考 此外 th
  • 空间频率 MTF和 SFR

    什么叫空间频率 我们日常中一般的频率是指时间频率 其单位是Hz 其定义是单位时间内 s 运动次数 官方定义 1 单位时间内完成振动或振荡的次数或周数 2 某一时间内某事物发生的次数或完成某过程的次数 这里的被除数是单位所以是时间频率 但是如
  • [现代控制理论]11_现代控制理论串讲_完结_pdf获取

    DR CAN的现代控制理论的笔记就结束了 加上这篇一共11篇 现代控制理论 11 现代控制理论串讲 完结 pdf获取 现代控制理论 10 可观测性与分离原理 观测器与控制器 现代控制理论 9 状态观测器设计 龙伯格观测器 现代控制理论 8
  • 数据结构(五):前序遍历、中序遍历、后序遍历

    我们先看下二叉树的前序 后序和中序遍历 遍历下面这个二叉树 分别以前中后三种遍历方式 写出结点的顺序 前序遍历 顺序 根左右 或 中左右 遍历根节点 遍历根结点的左子结点 如果左结点不是叶节点 则以当前结点开始 重新从第一步开始循环 遍历根
  • keil错误 *** FATAL ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED 解决方法

    keil错误 FATAL ERROR L250 CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED 解决方法 出现这个是你的keli没有破解 步骤如下 1 以管理员的身份运行你的keli 2 以管理
  • 【Java+MySQL】使用JDBC连接MySQL 8.0数据库

    一 Java MySQL 8 0连接驱动包 下载链接 https pan baidu com s 1YFOImz0dCHtzIajSFq9xgg pwd boul 提取码 boul IDEA 导入方式 1 在 External Librar
  • Mysql 学习

    文章目录 下载 安装 修改 修改登录密码 授权 下载 Mysql 数据库的下载链接 注意 CenterOS 请选择 Red Hat 那一项 安装 这里介绍的是 5 7 版本 安装包是 rpm bundle tar 结尾的 创建 mysql
  • ZC-CLS381RGB颜色识别——配置寄存器组(上)

    文章目录 前言 一 ZC CLS381RGB简介 二 配置寄存器组 1 主控寄存器 2 检测速率寄存器 2 增益寄存器 2 颜色数据寄存器 三 状态转移图和信号波形图绘制 总结 前言 在现代工业生产中 颜色识别技术已经成为了一个非常重要的技
  • 使用JsonConvert.DeserializeObject注意事项

    在使用JsonConvert DeserializeObject反序列化自定义对象的时候 我遇到了一个问题 定义了一个对象QueryModel QueryModel拥有两个构造方法 私有无参构造方法 private QueryModel 跟