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;
}

  

  

posted @   兴趣就是天赋  阅读(450)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示