C# 序列化Json时如何忽略JsonProperty(PropertyName =“ someName”)
前言
序列化大家都很常见,就是把一个对象序列化成一串Json 字符串。最近对接第三方的时候遇到了一个情况,我们C#都是用骆驼命名,而他们呢需要接收的Json字符串的 key 是 小写 的这时候要怎么处理呢!话不多说直接上代码开干
定义一个 Map 类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | using Newtonsoft.Json; using System; namespace JsonLower { public class Map { [JsonProperty( "id" )] public Guid ID { get ; set ; } [JsonProperty( "code" )] public string Code { get ; set ; } [JsonProperty( "name" )] public string Name { get ; set ; } } } |
主程序初始化数据转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 | using Newtonsoft.Json; using System; using System.Collections.Generic; namespace JsonLower { class Program { static void Main( string [] args) { List<Map> maps = new List<Map>() { new Map{ ID = Guid.NewGuid(), Code = "MD0001" , Name = "小明" }, new Map{ ID = Guid.NewGuid(), Code = "MD0002" , Name = "小红" }, new Map{ ID = Guid.NewGuid(), Code = "MD0003" , Name = "张三" }, }; var jsonStr = JsonConvert.SerializeObject(maps); Console.WriteLine(jsonStr); Console.ReadLine(); } } } |
看下效果
在属性上使用了 JsonProperty 特性,使得序列化时根据 JsonProperty 特性传入的字符串进行序列化,那我们有时候想忽略掉 JsonProperty 特性
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 42 43 44 45 46 | using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace JsonLower { /// <summary> /// Json 序列化 /// </summary> public class JsonHelper { /// <summary> /// 序列化是否按照JsonProperty显示Key /// </summary> /// <param name="obj"></param> /// <param name="isJsonProperty"></param> /// <returns></returns> public static string SerializeObject( object obj, bool isJsonProperty = false ) { var jsonSettings = new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore }; if (isJsonProperty) jsonSettings.ContractResolver = new LongNameContractResolver(); return JsonConvert.SerializeObject(obj, jsonSettings); } } public class LongNameContractResolver : DefaultContractResolver { protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) { IList<JsonProperty> list = base .CreateProperties(type, memberSerialization); foreach (JsonProperty prop in list) { prop.PropertyName = prop.UnderlyingName; } return list; } } } |
修改主程序代码
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 42 43 | using Newtonsoft.Json; using System; using System.Collections.Generic; namespace JsonLower { class Program { static void Main( string [] args) { List<Map> maps = new List<Map>() { new Map{ ID = Guid.NewGuid(), Code = "MD0001" , Name = "小明" }, new Map{ ID = Guid.NewGuid(), Code = "MD0002" , Name = "小红" }, new Map{ ID = Guid.NewGuid(), Code = "MD0003" , Name = "张三" }, }; //未忽略 { var jsonStr = JsonConvert.SerializeObject(maps); Console.WriteLine( "未忽略JsonProperty:" + jsonStr); } { var jsonStr = JsonHelper.SerializeObject(maps, true ); Console.WriteLine( "忽略JsonProperty:" + jsonStr); } Console.ReadLine(); } } } |
看一下效果图
大功告成!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~