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>(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
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();
}
///
/// 对于特殊日期时间格式的json转换
/// 参考文档:https://docs.microsoft.com/zh-cn/dotnet/standard/datetime/system-text-json-support
///
static void TestSpecialDateTimeConverter()
{
// Parsing non-compliant format as DateTime fails by default.
try
{
//使用默认的转换器 转化日期时间 失败
DateTime dt = JsonSerializer.Deserialize
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
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 值进行序列化和反序列化
*/
///
/// 自定义转换器。需实现抽象类JsonConverter<T>的抽象方法Read和Write
///
public class DateTimeConverterForCustomStandardFormatR : JsonConverter
{
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
bool result = System.Buffers.Text.Utf8Formatter.TryFormat(value, utf8Date, out _, new System.Buffers.StandardFormat('R'));
System.Diagnostics.Debug.Assert(result);
writer.WriteStringValue(utf8Date);
}
}
///
/// 角色
///
class Role
{
///
/// 编号
///
public int PlayerId { get; set; }
///
/// 姓名
///
public string PlayerName { get; set; }
///
/// 地址
///
public string Address { get; set; }
///
/// 地址
///
public string Weapon { get; set; }
}
///
/// 测试类
///
class TestClass
{
public int Id { get; set; }
public string MyName { get; set; }
///
/// 可以被忽略的属性
///
[JsonIgnore]
public string Summary { get; set; }
///
/// 当前时间
///
public DateTime CurrentTime { get; set; }
}
}
程序运行如图: