这么简单的序列化 System.Text.Json.Serialization 也报错了?

2023-11-05 23:08

本文主要是介绍这么简单的序列化 System.Text.Json.Serialization 也报错了?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

咨询区

  • kofifus

我准备将项目中的 JSON.NET 切换到原生的 System.Text.Json,但我遇到了个意外报错,测试代码如下:


using System.Text.Json.Serialization;
using Newtonsoft.Json;public class C {public C(string PracticeName) { this.PracticeName = PracticeName; }public string PracticeName;
}var x = new C("1");
var json = JsonConvert.SerializeObject(x); // returns "{\"PracticeName\":\"1\"}"var x1 = JsonConvert.DeserializeObject<C>(json); // correctly builds a Cvar x2 = System.Text.Json.Serialization.JsonSerializer.Parse<C>(json);

上面代码的最后一行将会报:


Exception thrown: 'System.NullReferenceException' in System.Text.Json.dll Object reference not set to an instance of an object.

请问我这是哪里做错了?

我发现可以通过 无参构造函数 来解决这个问题,但这样做的话就本末倒置了,请问是否有变通的方法实现原来 JSON.Net 就能实现的简单功能。

回答区

  • Christian Gollhardt

.NET Core 3.0 阶段,System.Text.Json 的开发工作还没有完全结束,目前阶段只支持无参构造函数,可能也许在未来会支持吧。

如果你是将老的版本迁移到 .NET Core 3.0 的话,我还是建议你用 Newtonsoft.Json

  1. MVC

从 Nuget 上安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson 包,然后将其注入到 services 容器中。


services.AddMvc().AddNewtonsoftJson();
  1. SignalR:

从 Nuget 上安装 Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson 包。


//Client
new HubConnectionBuilder()
.WithUrl("/chatHub")
.AddNewtonsoftJsonProtocol(...)
.Build();//Server
services.AddSignalR().AddNewtonsoftJsonProtocol(...);

这样的话就可以在 .NET Core 3.0 中使用 Json.NET 啦。

  • user11400447

要想解决这个问题,你必须做两点改动:

  1. PracticeName 要做成属性,而不是一个字段。

  2. 使用无参构造函数。

我写了一个控制台程序,其中 C1 通过 Newtonsoft.Json 转换, C2 通过 System.Text.Json


using Newtonsoft.Json;namespace TestJsonParse
{class Program{static void Main(string[] args){var c1 = new C1("1");var json1 = JsonConvert.SerializeObject(c1); // returns "{\"PracticeName\":\"1\"}"var x1 = JsonConvert.DeserializeObject<C1>(json1); // correctly builds a C1var c2 = new C2();string json2 = "{\"PracticeName\":\"1\"}";var x2 = System.Text.Json.Serialization.JsonSerializer.Parse<C2>(json2); // correctly builds a C2}class C1{public C1(string PracticeName) { this.PracticeName = PracticeName; }public string PracticeName;}class C2{public C2() { }public string PracticeName { get; set; }}}
}

点评区

时过境迁,我已经 System.Text.Json 都搞定了,然后我用了最新的 .NET 5 跑题主的代码。


namespace ConsoleApp3
{class Program{static void Main(string[] args){var json = "{\"PracticeName\":\"1\"}";//json.netvar x1 = JsonConvert.SerializeObject(json);//System.Text.Jsonvar x2 = System.Text.Json.JsonSerializer.Deserialize<C>(json);}}public class C{public C(string PracticeName) { this.PracticeName = PracticeName; }public string PracticeName;}
}

结果是。。。。继续报错。。。

这我还能说什么呢...

这篇关于这么简单的序列化 System.Text.Json.Serialization 也报错了?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/353034

相关文章

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

Python中json文件和jsonl文件的区别小结

《Python中json文件和jsonl文件的区别小结》本文主要介绍了JSON和JSONL两种文件格式的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 众所周知,jsON 文件是使用php JSON(JavaScripythonpt Object No

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

使用PyQt5编写一个简单的取色器

《使用PyQt5编写一个简单的取色器》:本文主要介绍PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16进制颜色编码,一款跟随鼠标刷新图像的RGB和16... 目录取色器1取色器2PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16

四种简单方法 轻松进入电脑主板 BIOS 或 UEFI 固件设置

《四种简单方法轻松进入电脑主板BIOS或UEFI固件设置》设置BIOS/UEFI是计算机维护和管理中的一项重要任务,它允许用户配置计算机的启动选项、硬件设置和其他关键参数,该怎么进入呢?下面... 随着计算机技术的发展,大多数主流 PC 和笔记本已经从传统 BIOS 转向了 UEFI 固件。很多时候,我们也

VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virtual disk”问题

《VMWare报错“指定的文件不是虚拟磁盘“或“Thefilespecifiedisnotavirtualdisk”问题》文章描述了如何修复VMware虚拟机中出现的“指定的文件不是虚拟... 目录VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virt

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要