.Net Core Json序列化和反序列化以及自定义JsonConverterT来转化特殊日期时间格式
System.Text.Json 命名空间提供用于序列化和反序列化 JavaScript 对象表示法 (JSON) 的功能。
System.Text.Json 命名空间包含所有入口点和主要类型。 System.Text.Json.Serialization 命名空间包含用于高级方案的特性和 API,以及特定于序列化和反序列化的自定义。
.Net Core中内置了对Json的转化与解析,默认对转化出的字段(属性)区分大小写。可将PropertyNameCaseInsensitive = true
设置为不区分大小写。
新建.Net Core 3.1 控制台应用程序JsonDemo,测试代码如下:
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace JsonDemo
{
class Program
{
static void Main(string[] args)
{
/*
* System.Text.Json 命名空间提供用于序列化和反序列化 JavaScript 对象表示法 (JSON) 的功能。
* System.Text.Json 命名空间包含所有入口点和主要类型。 System.Text.Json.Serialization 命名空间包含用于高级方案的特性和 API,以及特定于序列化和反序列化的自定义
*/
Console.WriteLine("测试将类序列号为json字符串....");
TestClass test = new TestClass()
{
Id = 25,
MyName = "张三",
Summary = "abcd",
CurrentTime = DateTime.Now
};
string jsonResult = JsonSerializer.Serialize(test,
new JsonSerializerOptions()
{
//中日韩统一表意文字(CJK Unified Ideographs) CJK (Chinese Japanese Korean) 汉字。CJK 是《GB2312-80》、《BIG5》等字符集的超集
Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.BasicLatin, System.Text.Unicode.UnicodeRanges.CjkUnifiedIdeographs),
WriteIndented = true //打印空格字符对齐
});
Console.WriteLine(jsonResult);
Console.WriteLine("测试将json字符串转换为指定的对象...");
string jsonString = @"[{""PlayerId"":15,""PlayerName"":""柷敔"",""Address"":""天晴之海""},{""PlayerId"":22,""playerName"":""越今朝"",""WEAPON"":""双剑""}]";
try
{
List<Role> list1 = JsonSerializer.Deserialize<List<Role>>(jsonString,
new JsonSerializerOptions()
{
//忽略大小写,如果不设置,默认区分大小写
PropertyNameCaseInsensitive = true
});
list1.ForEach(role => Console.WriteLine($"编号:{role.PlayerId},姓名:{role.PlayerName},地址:{role.Address},武器:{role.Weapon}"));
jsonString = @"[{""PlayerId"":15,""PlayerName"":""柷敔"",""Address"":""天晴之海""},{""PlayerId"":""22"",""playerName"":""越今朝"",""Weapon"":""双剑""}]";
Role[] list2 = JsonSerializer.Deserialize<Role[]>(jsonString,
new JsonSerializerOptions()
{
//忽略大小写
PropertyNameCaseInsensitive = true
});
foreach (Role role in list2)
{
Console.WriteLine($"编号:{role.PlayerId},姓名:{role.PlayerName},地址:{role.Address},武器:{role.Weapon}");
}
}
catch (Exception ex)
{
Console.WriteLine("json转换时出现异常:" + ex.Message);
}
Console.WriteLine("测试特殊日期时间格式的json转换...");
TestSpecialDateTimeConverter();
Console.ReadLine();
}
/// <summary>
/// 对于特殊日期时间格式的json转换
/// 参考文档:https://docs.microsoft.com/zh-cn/dotnet/standard/datetime/system-text-json-support
/// </summary>
static void TestSpecialDateTimeConverter()
{
// Parsing non-compliant format as DateTime fails by default.
try
{
//使用默认的转换器 转化日期时间 失败
DateTime dt = JsonSerializer.Deserialize<DateTime>(@"""Thu, 25 Jul 2019 13:36:07 GMT""");
Console.WriteLine(dt);
}
catch (JsonException e)
{
Console.WriteLine(e.Message);
}
// Using converters gives you control over the serializers parsing and formatting.
//使用自定义转化器;
JsonSerializerOptions options = new JsonSerializerOptions();
options.Converters.Add(new DateTimeConverterForCustomStandardFormatR());
string testDateTimeStr = "Thu, 25 Jul 2019 13:36:07 GMT";
string testDateTimeJson = @"""" + testDateTimeStr + @"""";
DateTime resultDateTime = JsonSerializer.Deserialize<DateTime>(testDateTimeJson, options);
Console.WriteLine(resultDateTime);
Console.WriteLine(JsonSerializer.Serialize(DateTime.Parse(testDateTimeStr), options));
}
}
/*
* 使用 Utf8Parser 和 Utf8Formatter
如果输入 DateTime 或 DateTimeOffset 文本表示形式符合 "R"、"l"、"O"、"G" 标准日期和时间格式字符串中的一个或 "G"标准日期和时间格式字符串,或者需要根据这些格式中的一种进行写入,则可以在转换器逻辑中使用快速的基于 utf-8 的分析和格式设置方法。
这比使用 DateTime(Offset).Parse 和 DateTime(Offset).ToString快得多。
此示例演示一个自定义转换器,该转换器根据"R" 标准格式对 DateTime 值进行序列化和反序列化
*/
/// <summary>
/// 自定义转换器。需实现抽象类JsonConverter<T>的抽象方法Read和Write
/// </summary>
public class DateTimeConverterForCustomStandardFormatR : JsonConverter<DateTime>
{
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
System.Diagnostics.Debug.Assert(typeToConvert == typeof(DateTime));
if (System.Buffers.Text.Utf8Parser.TryParse(reader.ValueSpan, out DateTime value, out _, 'R'))
{
return value;
}
throw new FormatException();
}
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
// The "R" standard format will always be 29 bytes.
Span<byte> utf8Date = new byte[29];
bool result = System.Buffers.Text.Utf8Formatter.TryFormat(value, utf8Date, out _, new System.Buffers.StandardFormat('R'));
System.Diagnostics.Debug.Assert(result);
writer.WriteStringValue(utf8Date);
}
}
/// <summary>
/// 角色
/// </summary>
class Role
{
/// <summary>
/// 编号
/// </summary>
public int PlayerId { get; set; }
/// <summary>
/// 姓名
/// </summary>
public string PlayerName { get; set; }
/// <summary>
/// 地址
/// </summary>
public string Address { get; set; }
/// <summary>
/// 地址
/// </summary>
public string Weapon { get; set; }
}
/// <summary>
/// 测试类
/// </summary>
class TestClass
{
public int Id { get; set; }
public string MyName { get; set; }
/// <summary>
/// 可以被忽略的属性
/// </summary>
[JsonIgnore]
public string Summary { get; set; }
/// <summary>
/// 当前时间
/// </summary>
public DateTime CurrentTime { get; set; }
}
}
程序运行如图:
.Net Core Json序列化和反序列化以及自定义JsonConverterT来转化特殊日期时间格式相关推荐
- 一文读懂Json序列化与反序列化
一文读懂Json序列化与反序列化 一文读懂Json序列化与反序列化 #mermaid-svg-tVjnnlFu6ZBDpGOQ {font-family:"trebuchet ms" ...
- DotNet的JSON序列化与反序列化
JSON(JavaScript Object Notation)JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.在现在的通信中,较多的采用JSON数据格式,JSON有 ...
- Go进阶(7): JSON 序列化和反序列化
1. json序列化和反序列化基础 json数据的序列化和反序列化是一种非常常见的方式,尤其是在http/rcp的微服务调试中. 基础语法 在 Go 中我们主要使用官方的 encoding/json ...
- JavaScript JSON序列化和反序列化
文章目录 JavaScript JSON序列化和反序列化 概述 JSON序列化 JSON.stringify() 仅一个参数使用 使用2个参数 使用3个参数 其他 自定义toJson 序列化顺序 反序 ...
- JAVA中JSON序列化和反序列化
JAVA中JSON序列化和反序列化 1 FASTJSON的序列化和反序列化 1.1 主函数 1.2 自定义对象 2 GSON序列化和反序列化 2.1 主函数 2.2 自定义对象 总结 不同包序列化和反 ...
- LocalDateTime的JSON序列化和反序列化
jackson的json中Date的序列化和反序列化 import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jac ...
- JSON序列化和反序列化还有这种玩法
Mixin对于前端开发者可不陌生,Vue.React等知名前端框架都使用了Mixin.而对于后端开发,尤其是Java后端开发来说Mixin却是一个很陌生的概念.今天来我们通过Jackson让后端开发者 ...
- C#中JSON序列化和反序列化
有一段时间没有到博客园写技术博客了,不过每天逛逛博客园中大牛的博客还是有的,学无止境-- 最近在写些调用他人接口的程序,用到了大量的JSON.XML序列化和反序列化,今天就来总结下json的序列化和反 ...
- json 反序列化 父子类型_Jaskson精讲第7篇-类继承关系下的JSON序列化与反序列化JsonTypeInfo...
Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的, ...
最新文章
- Windows Server vNext Technical Preview UI Build 9841
- mybatis使用find_in_set导致cpu占用过高
- [云炬创业基础笔记]第五章创业机会评估测试11
- Kettle使用_8 存储过程结合获取系统信息
- 企业使用RTX腾讯通2013
- Axial symmetry FZU - 2035
- uva 10118 ——Free Candies
- Java泛型初探————泛型通配
- linux讲日志暂停,linux – Rsyslog在日志轮换后停止向远程服务器发送数据
- Python-cvxopt库的使用(1)(解决LP问题)
- 【Java从0到架构师】SSM 整合(XML、纯注解)
- ue4集合类型_UE4.22 Subsystem分析
- Android自定义View里面获取宽高及dp和px间的转换
- 多变量时间序列相似度量
- 网鼎杯2020 玄武组部分writeup
- 面试真题纠错(京东、爱奇艺)
- H5网页涂鸦canvas
- python3.7 安装 scrapy, pip 升级
- 2022跨年烟花代码(四)HTML5全屏烟花动画特效
- k8s二进制安装-3,配置ca证书