C#之System.Text.Json的用法
System.Text.Json 是 C# 中的一个 JSON 序列化和反序列化库,它在 .NET Core 3.0 及更高版本中提供了内置支持。以下是 System.Text.Json 的用法详解:
JSON 序列化
JSON 序列化是将 .NET 对象转换为 JSON 字符串的过程。
using System;
using System.Text.Json;
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
var person = new Person
{
Name = "John",
Age = 30
};
string jsonString = JsonSerializer.Serialize(person);
Console.WriteLine(jsonString);
}
}
上述代码中,我们定义了一个 Person 类,然后使用 JsonSerializer.Serialize 方法将 person 对象转换为 JSON 字符串。
反序列化
JSON 反序列化是将 JSON 字符串转换回 .NET 对象的过程。
using System;
using System.Text.Json;
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
string jsonString = "{\"Name\":\"John\",\"Age\":30}";
Person person = JsonSerializer.Deserialize<Person>(jsonString);
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
}
}
上述代码中,我们使用 JsonSerializer.Deserialize 方法将 JSON 字符串转换为 Person 对象。
高级用法
System.Text.Json 还提供了许多高级选项,以控制序列化和反序列化过程。您可以使用 JsonSerializerOptions 来自定义行为,如命名策略、空值处理、日期时间格式化等。
var options = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = true, // 格式化输出
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault,
Converters = { new MyCustomConverter() }
};
string jsonString = JsonSerializer.Serialize(person, options);
自定义转换器
public class MyCustomConverter : JsonConverter<MyType>
{
public override MyType Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
// 反序列化逻辑
}
public override void Write(Utf8JsonWriter writer, MyType value, JsonSerializerOptions options)
{
// 序列化逻辑
}
}
然后,将自定义转换器添加到 JsonSerializerOptions 中,如前面的示例所示。
这些是 System.Text.Json 的一些基本用法和高级功能。它提供了一种轻量级且高性能的方式来处理 JSON 数据,适用于序列化和反序列化任务。在开发中,您可以根据需要使用它来与 JSON 数据进行交互。
最后需要注意的是:反序列化是case-sensitive的。
如果要设置为noncase-sensitive:
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
public class CaseInsensitivePropertyConverter<T> : JsonConverter<T>
{
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.StartObject)
{
using (JsonDocument doc = JsonDocument.ParseValue(ref reader))
{
var root = doc.RootElement;
var obj = Activator.CreateInstance<T>();
foreach (var property in root.EnumerateObject())
{
var propertyName = property.Name;
var propertyValue = property.Value;
var propertyInfo = typeof(T).GetProperty(propertyName, System.Reflection.BindingFlags.IgnoreCase | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
if (propertyInfo != null)
{
object value = JsonSerializer.Deserialize(propertyValue.GetRawText(), propertyInfo.PropertyType);
propertyInfo.SetValue(obj, value);
}
}
return obj;
}
}
throw new JsonException("Expected start of an object.");
}
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
{
JsonSerializer.Serialize(writer, value, options);
}
}
public class QRInfo
{
public string qqrStr { get; set; }
public decimal priwce { get; set; }
}
public class Program
{
public static void Main()
{
var options = new JsonSerializerOptions();
options.Converters.Add(new CaseInsensitivePropertyConverter<QRInfo>());
var testStr = "{\"qqrStr\":\"gkjfdsgjffdsljgfdskljgfdklj",\"priwce\":0.01}";
var qrInfoTest = JsonSerializer.Deserialize<QRInfo>(testStr, options);
Console.WriteLine(qrInfoTest.qqrStr);
Console.WriteLine(qrInfoTest.priwce);
}
}
C#之System.Text.Json的用法的更多相关文章
- [译]试用新的System.Text.Json API
译注 可能有的小伙伴已经知道了,在.NET Core 3.0中微软加入了对JSON的内置支持. 一直以来.NET开发者们已经习惯使用Json.NET这个强大的库来处理JSON. 那么.NET为什么要增 ...
- .NET 5的System.Text.Json的JsonDocument类讲解
本文内容来自我写的开源电子书<WoW C#>,现在正在编写中,可以去WOW-Csharp/学习路径总结.md at master · sogeisetsu/WOW-Csharp (gith ...
- 使用System.Text.Json处理Json文档以及部分坑
System.Text.Json处理Json文档需要用到JsonDocument,JsonElement,JsonProperty. JsonDocument就是一个表示Json文档的东西,JsonE ...
- 在.Net Core 3.0中尝试新的System.Text.Json API
.NET Core 3.0提供了一个名为System.Text.Json的全新命名空间,它支持reader/writer,文档对象模型(DOM)和序列化程序.在此博客文章中,我将介绍它如何工作以及如何 ...
- .netcore3.0 System.Text.Json 日期格式化
.netcore3.0 的json格式化不再默认使用Newtonsoft.Json,而是使用自带的System.Text.Json来处理. 理由是System.Text.Json 依赖更少,效率更高. ...
- In .net 4.8,calculate the time cost of serialization in BinaryFormatter,NewtonSoft.json,and System.Text.Json.JsonSerializer.Serialize
using ConsoleApp390.Model; using Newtonsoft.Json; using System; using System.Collections.Generic; us ...
- C# Serialization performance in System.Runtime.Serialization.Formatters.Binary.BinaryFormatter,Newtonsoft.Json.JsonConvert and System.Text.Json.JsonSerializer.Serialize
In .net core 3.0 using System;using System.Collections.Generic;using System.Collections;using System ...
- .NET Core 内置的 System.Text.Json 使用注意
System.Text.Json 是 .NET Core 3.0 新引入的高性能 json 解析.序列化.反序列化类库,武功高强,但毕竟初入江湖,炉火还没纯青,使用时需要注意,以下是我们在实现使用中遇 ...
- Net core 2.x 升级 3.0 使用自带 System.Text.Json 时区 踩坑经历
.Net Core 3.0 更新的东西很多,这里就不多做解释了,官方和博园大佬写得很详细 关于 Net Core 时区问题,在 2.1 版本的时候,因为用的是 Newtonsoft.Json,配置比较 ...
- .net core中关于System.Text.Json的使用
在.Net Framework的时候序列化经常使用Newtonsoft.Json插件来使用,而在.Net Core中自带了System.Text.Json,号称性能更好,今天抽空就来捣鼓一下. 使用起 ...
随机推荐
- Linux 宝塔常用命令教程
一.引言 在 Linux 服务器管理中,宝塔面板是一款非常实用的工具.然而,了解一些相关的命令可以让我们在特定情况下更高效地进行操作和管理.本文将为您介绍一些常用的 Linux 宝塔相关命令. 二.安 ...
- docker - [05] 部署Nginx
题记部分 一.查找镜像 docker search nginx 二.拉取镜像 docker pull nginx 三.启动镜像 Nginx默认端口号为80,可以在启动时指定Nginx使用的端口号(例如 ...
- 【攻防世界】wife_wife
wife_wife 题目来源 攻防世界 NO.GFSJ1192 题解 本题没有源码,也没有提示,非常困难,在网上搜索此题可以看到源码.由于使用了assign(),因此存在Javascript原型链污染 ...
- Vigenere密码无密钥求解
0.前言 最近摸了很长时间的鱼,然后最近突然想搞一个Vigenere密码的自动求解,花了不到一天来实现了一下这个东西,不过受限于自己的水平,没有搞的太难.当然,代码部分不是全部都是从 0 开始的,关于 ...
- Python装饰器:套层壳我变得更强了!
Python装饰器:套层壳我变得更强了 Python装饰器:套层壳我变得更强了 关于作用域和闭包可以聊点什么? 什么是作用域 什么是闭包 装饰器:套层壳我变得更强了 参考资料 昨天阅读了<Pyt ...
- 【ARM+Qt+OpenCV】基于ARM的双目图像采集系统
点击查看代码 系统使用ARM处理器,运行linux系统,Qt创建工程编写主程序,可以使用OpenCV进行图像处理. 通过两个摄像头采集会图像,在LCD上进行显示,然后通过LCD上的按钮实现退出程序.保 ...
- AXUI前端框架v3版本已经发布,底层完全改写,基于原生技术标准,想走得更远!
AXUI的v3版本已经发布! AXUI框架已经经历了第一代和第二代的迭代,充分认识到纯CSS和HTML的局限性,也意识到过多手动编写代码会影响用户体验.因此,AXUI的目标是:既满足原生前端的标准,又 ...
- 第一次记录自己的java学习日常,之前都是看其他博主的java知识,现在该自己记录一下了。
对知识做总结 在学校呢,走过了非常多的坑,参加了一些比赛,但是也没有学到什么(含金量高的比赛可以参加,但是需参加之前先沉淀好自己的技术,不要报名了才去准备,得在准备中去报名),学校教的知识都是理论化, ...
- 汇编概念辨析(Intel/AT&T syntax、GAS、NASM)
写在前面 本文并不详细介绍Intel syntax.AT&T syntax.GAS.NASM的具体内容和具体区别,而是从概念辨析的角度说明这些专有名词的含义,以便为初学者扫清疑惑.有兴趣深入了 ...
- 学习unigui【28】UniGUI接收POST/GET
小儿科问题,直接上流程代码: 1 procedure TUniServerModule.UniGUIServerModuleHTTPCommand( 2 ARequestInfo: TIdHTTPRe ...