C#操作JSON(序列化与反序列化)的方法详解
作者:微小冷 发布时间:2022-01-27 20:15:10
.net core提供了Json处理模块,在命名空间System.Text.Json中,下面通过顶级语句,对C#的Json功能进行讲解。
序列化
将C#对象编辑为Json格式字符串的过程,即为Json序列化,在C#中,通过JsonSerializer.Serialize来实现
using System.Text.Json;
public class WeatherInfo
{
public DateTimeOffset Date { get; set; }
public int Temperature { get; set; }
public string? Summary { get; set; }
}
var wInfo = new WeatherInfo
{
Date = DateTime.Now,
Temperature = 25,
Summary = "Hot"
};
string js = JsonSerializer.Serialize(wInfo);
File.WriteAllText("test.json", js); //将其输出为文件
Console.WriteLine(js);
上例中,wInfo是WeatherInfo的对象,通过Json序列化,成功将其转化为字符串,输出结果如下
{"Date":"2023-05-11T15:52:49.4942993+08:00","Temperature":25,"Summary":"Hot"}
反序列化
将json字符串读取为C#对象的过程,即为反序列化,以刚刚创建的test.json为例,通过泛型函数Deserialize<T>,可将其转化为C#对象
string js = File.ReadAllText("test.json");
var w = JsonSerializer.Deserialize<WeatherInfo>(js);
Console.WriteLine($"{w.Date}\r\n{w.Temperature}\r\n{w.Summary}");
测试结果为
2023/5/11 15:54:46 +08:00
25
Hot
与字典互转
考虑到并非所有json数据都能找到C#中对应的类,为了更加灵活地操作json数据,在实际使用中,可以建立json和字典的转换方法。如果仍然使用System.Text.Json中的方法,则需要继承抽象类JsonConverter<T>,并重写其中用于转换的内容,相对来说比较麻烦,所以推荐使用经典的NewtonSoft.Json,需要在NuGet中搜索添加。
在Newtonsoft.Json中,函数JsonConvert.DeserializeObject完全具备System.Text.Json中JsonSerializer.Deserialize的所有功能,同时开可以将泛型变量设为字典
using Newtonsoft.Json;
var dct = JsonConvert.DeserializeObject<Dictionary<string, string>>(js);
foreach (var item in dct)
Console.WriteLine($"{item.Key}:{item.Value}");
结果为
Date:2023-05-11T15:54:46.2907782+08:00
Temperature:25
Summary:Hot
相应地,将字典编写为json格式字符串,可通过JsonConvert.SerializeObject来实现
var dct = new Dictionary<string, string>()
{
{"Date", DateTime.Now.ToString("f") },
{"Temp", "25" },
{"Summary", "Hot" }
};
string js = JsonConvert.SerializeObject(dct);
Console.WriteLine(js);
效果为
{"Date":"2023年5月11日 16:44","Temp":"25","Summary":"Hot"}
来源:https://blog.csdn.net/m0_37816922/article/details/130625658


猜你喜欢
- 本文实例讲述了Java实现删除排序数组中重复元素的方法。分享给大家供大家参考,具体如下:题目描述:给定一个排序数组,在原数组中删除重复出现的
- 目录Sonar概述一、 搭建sona服务二、idea配置三、 配置maven的setting.xml文件四、idea中 mvn sonar:
- 界面开发中,经常使用观察者设计模式来实现文档/视图模式,当文档内容改变时,作为观察者的用户视图必须相应作出调整以向用户呈现文档的状态。由于语
- Spring @Async无法实现异步问题原因项目中存在2个配置文件:springMVC.xml和beanDefines.xml,它们都配置
- 今天突然想起来,java产生随机数的问题,上机试了一下,找到了一点区别,在这里总结一下;直接调用Math.random()是产生一个[0,1
- 通过路径从磁盘直接读取图片这段时间在做Springboot和Vue的例子,读取图片给出路径直接可以读,太方便了,一直么有搞懂为什么。后面看到
- TabHost组件可以在界面中存放多个选项卡, 很多软件都使用了改组件进行设计。一、基础知识TabWidget : 该组件就是TabHost
- 最新需要公司要求在不改变原来的登录逻辑的情况下,将原来的验证码登录的形式改成滑动图片的形式!下面是做出来的效果:实现思路:所有的图片数据,验
- 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。java.net包中J2SE的API包含有类和接口,它们提供低层
- 入门Springboot项目创建在IDEA中创建即可。注意点:1、所有文件都需要放在 :Application文件的同级或下级目录中2、ap
- 有关临时对象的生命周期有三种情况:1)一般情况:临时性对象的被摧毁,应该是对完整表达式(full-expression)求值过程中的最后一个
- 很多时候忘记Android摄像头如何打开,查看google文档的话,发现太复杂(只是单纯的想打开摄像头而已,不想添加那么多设置,添加那么功能
- 背景产品想对多次快速点击做一下优化,想要的效果就是双击不会打开多次但是从开发角度来说,我可以用kotlin的拓展方法来调整这个,但是之前的历
- Java基本类型与byte数组之间相互转换,刚刚写的package cn.teaey.utils;import java.nio.chars
- MyBatis添加记录后获取主键ID,这是一个很常见的需求。这个需求有分为两种情况:(1)添加单条记录时获取主键值;(2)获取批量添加记录时
- 1.如果执行了try块没有异常,则继续运行finally块中的语句,即使try块通过return,break,或者continue于最后的语
- ViewAndroid所有的控件都是View或者View的子类,它其实表示的就是屏幕上的一块矩形区域,用一个Rect来表示,left,top
- 1. 什么是 spring-boot-devtoolsspring-boot-devtools 是 spring-boot项目开发时的一个热
- IntroC# 9 中进一步增强了模式匹配的用法,使得模式匹配更为强大,我们一起来了解一下吧SampleC# 9 中增强了模式匹配的用法,增
- 前言在Android开发中经常会遇到EditText控件,而在App开发过程中、遇到了这样一个问题、那就是Android EditText控