zoukankan      html  css  js  c++  java
  • 字段值为 null 时,序列化或反序列化成其他值

    using Newtonsoft.Json;
    using Newtonsoft.Json.Serialization;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Json.Useage
    {
        /// <summary>
        /// serialize null to empty
        /// </summary>
        class Program
        {
            static void Main(string[] args)
            {
                var test = new Test();
                var settings = new JsonSerializerSettings() { ContractResolver = new NullToEmptyStringResolver() };
                var obj = JsonConvert.SerializeObject(test, settings);
                var obj2 = JsonConvert.SerializeObject(test);
    
                var json = "{'Field': null }";
                var t = JsonConvert.DeserializeObject<Test>(json, settings);
                Console.WriteLine(t.Field);
                Console.WriteLine(obj2);
                Console.WriteLine(obj);
    
                Console.ReadKey();
            }
        }
    
        public class Test
        {
            [DefaultValue("")]
            public string Field { get; set; }
        }
    
        public class NullToEmptyStringResolver : Newtonsoft.Json.Serialization.DefaultContractResolver
        {
            protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
            {
                return type.GetProperties()
                        .Select(p =>
                        {
                            var jp = base.CreateProperty(p, memberSerialization);
                            jp.ValueProvider = new NullToEmptyStringValueProvider(p);
                            return jp;
                        }).ToList();
            }
        }
    
        public class NullToEmptyStringValueProvider : IValueProvider
        {
            PropertyInfo _MemberInfo;
            public NullToEmptyStringValueProvider(PropertyInfo memberInfo)
            {
                _MemberInfo = memberInfo;
            }
    
            public object GetValue(object target)
            {
                object result = _MemberInfo.GetValue(target);
    
                if (_MemberInfo.PropertyType == typeof(string) && result == null) result = " ";
    
                return result;
    
            }
    
            public void SetValue(object target, object value)
            {
                if (_MemberInfo.PropertyType == typeof(string) && value == null) value = "";
    
                _MemberInfo.SetValue(target, value);
            }
        }
    
    }

    这里只写了 string 类型的,其他类型需要转换的再加 if 条件就好了

  • 相关阅读:
    第六章 虹销雨霁(中)
    第四章 曙光初现(下)
    第三章 曙光初现(上)
    第二章 福祸相伴(下)
    第二章 福祸相伴(上)
    小云(云层-陈霁)的发展史
    小白成长建议(9)-苞丁解牛
    NYoj 116士兵杀敌(二)区间求和,单点更新
    HDU 1754 区间查询,单点更新
    《灯亮or灯灭》 --有个有趣的数论问题
  • 原文地址:https://www.cnblogs.com/myesn/p/serialize-null-to-empty.html
Copyright © 2011-2022 走看看