如何在request.Data为空时序列化出带属性名的JSON数组
解决空Data时返回含空属性对象的JSON数组问题
现有基于Newtonsoft.Json的C#序列化代码如下:
using Newtonsoft.Json; public async Task<string> Handle(ConvertToJsonQuery request, CancellationToken cancellationToken) { return Serialize(PrepareObjectForSerialization(request), LanguageEnum.HR); } private object PrepareObjectForSerialization(ConvertToJsonQuery request) { Type listType = typeof(List<>).MakeGenericType(Type.GetType(request.TypeOfList)); return JsonConvert.DeserializeObject(request.Data, listType); } private string Serialize(object obj, LanguageEnum lang) { var settings = new JsonSerializerSettings { ContractResolver = new MultiLangResolver(lang), Formatting = Newtonsoft.Json.Formatting.Indented, }; return JsonConvert.SerializeObject(obj, settings); }
当前代码在request.Data非空时,能正常输出如下格式的JSON数组:
[ { "Institution": "19.10.", "FemaleTotal": 1 }, { "Institution": "my institution", "FemaleTotal": 2 } ]
但当request.Data为空时,返回结果为[],需要修改代码,使其返回包含一个所有属性值为null的对象的数组,示例如下:
[ { "Institution": null, "FemaleTotal": null } ]
修改后的完整代码
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; public async Task<string> Handle(ConvertToJsonQuery request, CancellationToken cancellationToken) { return Serialize(PrepareObjectForSerialization(request), LanguageEnum.HR); } private object PrepareObjectForSerialization(ConvertToJsonQuery request) { // 获取目标元素类型 Type itemType = Type.GetType(request.TypeOfList); Type listType = typeof(List<>).MakeGenericType(itemType); // 判断Data是否为空或空白字符串 if (string.IsNullOrWhiteSpace(request.Data)) { // 创建一个空的目标类型实例 object emptyItem = Activator.CreateInstance(itemType); // 创建列表并添加空实例 IList list = (IList)Activator.CreateInstance(listType); list.Add(emptyItem); return list; } // 原有非空Data的反序列化逻辑 return JsonConvert.DeserializeObject(request.Data, listType); } private string Serialize(object obj, LanguageEnum lang) { var settings = new JsonSerializerSettings { ContractResolver = new MultiLangResolver(lang), Formatting = Newtonsoft.Json.Formatting.Indented, }; return JsonConvert.SerializeObject(obj, settings); }
关键改动说明
- 在
PrepareObjectForSerialization方法中增加了对request.Data的空值/空白判断 - 当Data为空时,通过
Activator.CreateInstance创建目标类型的空实例,再包装成对应类型的列表返回 - 保留了原有非空Data时的反序列化逻辑,不影响正常场景的功能
内容的提问来源于stack exchange,提问作者Lube
相关产品推荐
相关产品推荐

