Newtonsoft 序列化、反序列

环境:

Net 4.5 

Newtonsoft.Json 13.0.0.0

场景:

{
	"Age": "25",
	"Name": "czj"
}

 客户给我上面这样的json串,让反序列化后,修改对象后,再需要序列化输出如下格式:

{
	"年龄": "28",
	"姓名": "qwe"
}

添加特性:

public class CrJsonAttribute : Attribute
    {
        /// <summary>
        /// 序列化名称
        /// </summary>
        public string SerializeName { get; set; }

        /// <summary>
        /// 反序列名称
        /// </summary>
        public string DeserializeName { get; set; }

        /// <summary>
        /// 可序列化
        /// </summary>
        public bool EnableSerialize { get; set; }

        /// <summary>
        /// 可反序列化
        /// </summary>
        public bool EnableDeserialize { get; set; }

        public CrJsonAttribute()
        {
            this.EnableSerialize = true;
            this.EnableDeserialize = true;
        }
    }

添加:DefaultContractResolver 解析器

 /// <summary>
    /// 反序列化解析器
    /// </summary>
    public class OcrDeserializeResolver : DefaultContractResolver
    {
        protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
        {
            var property = base.CreateProperty(member, memberSerialization);
            var attr = member.GetCustomAttribute(typeof(CrJsonAttribute)) as CrJsonAttribute;
            if (attr != null)
            {
                property.PropertyName = attr.DeserializeName ?? property.PropertyName;
                property.Writable = attr.EnableDeserialize;
            }
            return property;
        }
    }

    /// <summary>
    /// 序列化解析器
    /// </summary>
    public class OcrSerializeResolver : DefaultContractResolver
    {
        protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
        {
            var property = base.CreateProperty(member, memberSerialization);
            var attr = member.GetCustomAttribute(typeof(CrJsonAttribute)) as CrJsonAttribute;
            if (attr != null)
            {
                property.PropertyName = attr.SerializeName ?? property.PropertyName;
                property.Readable = attr.EnableSerialize;
            }
            return property;
        }
    }

添加实体Student:

    public class Student
    {
        [CrJsonAttribute(SerializeName = "姓名")]
        public string Name { get; set; }

        [CrJsonAttribute(SerializeName = "年龄")]
        public string Age { get; set; }
    }

program:

static void Main(string[] args)
        {
            string json = "{\"Age\":\"25\",\"Name\":\"czj\"}";
            var settings = new JsonSerializerSettings() { ContractResolver = new OcrDeserializeResolver() };
            Student result = JsonConvert.DeserializeObject<Student>(json, settings);

            result.Age = "28";
            result.Name = "qwe";
            settings = new JsonSerializerSettings() { ContractResolver = new OcrSerializeResolver() };
            var content = JsonConvert.SerializeObject(result, settings);
            //output:{"姓名":"qwe","年龄":"28"}
        }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值