System.Test.Json 转换
datetime空值转换
- 创建转换器 DateTimeNullJsonConvert.cs
/// <summary> /// datetime 空值转换 /// </summary> public class DateTimeNullJsonConvert : JsonConverter<Nullable<DateTime>> { /// <summary> /// 读取 /// </summary> /// <param name="reader"></param> /// <param name="typeToConvert"></param> /// <param name="options"></param> /// <returns></returns> public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType == JsonTokenType.Null) { return default; } if (reader.TokenType == JsonTokenType.String) { if (DateTime.TryParse(reader.GetString(), out DateTime date)) { return date; } return default; } return reader.GetDateTime(); } /// <summary> /// 输出 /// </summary> /// <param name="writer"></param> /// <param name="value"></param> /// <param name="options"></param> public override void Write(Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options) { writer.WriteStringValue(value == null ? "" : value.Value.ToString("yyyy-MM-dd HH:mm:ss")); } }
- 在Setup.cs 配置文件AddJsonOptions中加入
services.AddControllers().AddJsonOptions(opt => { //修复日期空值返回异常 opt.JsonSerializerOptions.Converters.Add(new DateTimeNullJsonConvert()); })
循环引用
例如目录结构需要循环引用本身 而 System.Test.Json 不允许套嵌引用过多 可使用以下方案解决
- 方案一
- 使用
Newtonsoft.Json
在StartUp.cs
中添加
services.AddControllers().AddNewtonsoftJson();
- 使用
- 方案二
- 如果当前项目必须使用
System.Test.Json
那就将需要进行循环引用的数据进行单独转换 单独使用Newtonsoft.Json
例如
public IActionResult Index(){ var res = new NodeTree(); var str = Newtonsoft.Json.JsonConvert.SerializeObject(res); return Json(str); }
- 如果当前项目必须使用