这么简单的序列化 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

相关文章

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

MySQL启动报错:InnoDB表空间丢失问题及解决方法

《MySQL启动报错:InnoDB表空间丢失问题及解决方法》在启动MySQL时,遇到了InnoDB:Tablespace5975wasnotfound,该错误表明MySQL在启动过程中无法找到指定的s... 目录mysql 启动报错:InnoDB 表空间丢失问题及解决方法错误分析解决方案1. 启用 inno

SpringBoot实现Kafka动态反序列化的完整代码

《SpringBoot实现Kafka动态反序列化的完整代码》在分布式系统中,Kafka作为高吞吐量的消息队列,常常需要处理来自不同主题(Topic)的异构数据,不同的业务场景可能要求对同一消费者组内的... 目录引言一、问题背景1.1 动态反序列化的需求1.2 常见问题二、动态反序列化的核心方案2.1 ht