Newtonsoft.Json将可空类型转换为空字符串(支持所有类型)
第一步:json自定义解析协议
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | /// <summary> /// json自定义解析协议 /// </summary> public class SpecialJsonContractResolver : DefaultContractResolver { protected override IValueProvider CreateMemberValueProvider(MemberInfo member) { if (member.MemberType == MemberTypes.Property) { var pi = (PropertyInfo)member; if (pi.PropertyType == typeof ( string ) || pi.PropertyType == typeof (DateTime) || pi.PropertyType == typeof (DateTime?)) { return new NullableJsonValueProvider(pi); } } return base .CreateMemberValueProvider(member); } } <br> /// <summary> ///空值序列化提供程序 /// </summary> public class NullableJsonValueProvider : IValueProvider { private static readonly string _defaultValue = string .Empty; private readonly PropertyInfo _propertyInfo; public NullableJsonValueProvider(PropertyInfo propertyInfo) { _propertyInfo = propertyInfo; } public void SetValue( object target, object value) { _propertyInfo.SetValue(target, value); } public object GetValue( object target) { return _propertyInfo.GetValue(target) ?? _defaultValue; } } |
第二步:空值处理(以时间类型为例)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public class DateTimeFormatConverter : IsoDateTimeConverter { private static readonly string strEmpty = string .Empty; public DateTimeFormatConverter( string format) { DateTimeFormat = format; } /// <summary> /// 重载序列化方法 /// </summary> /// <param name="writer"></param> /// <param name="value"></param> /// <param name="serializer"></param> public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { if (value == null || value.Equals( "" ) || value.Equals(DateTime.MinValue)) { writer.WriteValue(strEmpty); } else { base .WriteJson(writer, value, serializer); } } } |
第三步:使用
1 2 3 4 5 6 7 8 9 10 | public string TestJson() { JsonSerializerSettings settings = new JsonSerializerSettings(); settings.Converters.Add( new DecimalDigitsConvert()); //只处理decimal类型的属性 settings.Converters.Add( new DateTimeFormatConverter( "yyyy/MM/dd" )); //默认时间格式处理 settings.ContractResolver = new SpecialJsonContractResolver(); //自定义解析协议 string json = JsonConvert.SerializeObject( new Models.StudentInfo.StudentInfo_ClassInfo() { ClassName = "班级名称" }, settings); return json; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构