自定义JSON.NET更改空值和属性名

2023/7/6 10:13:32

在.NET平台中要序列化JSON对象,有很多轻量级框架可供选择,我通常使用Newtonsoft的JSON.NET框架,虽然它足够的灵活,提供很多的转换器,但在实际开发中发现下面两种需求JSON.NET自身的转换器将变得无能为力:

1、序列化时将对象的null值转换为空字符串(双引号),而不是输出null值。

2、在序列化和反序列化时需要修改属性名、转换属性名大小写,或者通过自己的规则映射属性名。

3、在.NET中属性采用PascalCase规则(首字母大写),在JavaScript中属性名使用CamelCase规则(首字母小写)

基于特殊的需求,为了不影响原本框架,零度自己实现了个性化的转换器CustomJsonConverter用于解决上述问题,CustomJsonConverter.cs将在本文末尾提供下载,您可以直接添加到自己的项目中,下面是自定义转换器的使用示例。

将NULL空值转换为空字符串

public class Computer { public string Name { get; set; } public decimal SalePrice { get; set; } public int? StockCount { get; set; } }

Computer computer = new Computer(); computer.Name = "零度计算机"; computer.SalePrice = 1023.55M; computer.StockCount = null; CustomJsonConverter convert = new CustomJsonConverter(); //自定义转换器 convert.PropertyNullValueReplaceValue = ""; //设置替换NULL值得字符串 string str = JsonConvert.SerializeObject(computer, convert);

序列化后的结果如下所示,已将StockCount的null转换为空字符串。

{ "Name": "零度计算机", "SalePrice": 1023.55, "StockCount": "" }

使用CamelCase或者PascalCase命名规则将属性名首字母大小写输出

CustomJsonConverter convert = new CustomJsonConverter(); convert.PropertyNameCase = ConverterPropertyNameCase.CamelCase; string str = JsonConvert.SerializeObject(computer, convert);

序列化后的结果将属性名首字母采用CamelCase风格小写输出,如下所示:

{ "name": "零度计算机", "salePrice": 1023.55, "stockCount": null }

使用回调函数自定义属性转换规则

CustomJsonConverter convert = new CustomJsonConverter(); convert.ProperyNameConverter = o => { return o.ToUpper(); }; string str = JsonConvert.SerializeObject(computer, convert);

上面的代码自定义一个回调用函数将属性名全部转换成大写形式,序列化有的结果:

{ "NAME": "零度计算机", "SALEPRICE": 1023.55, "STOCKCOUNT": null }

自定义转换器支持动态类型和匿名对象

dynamic book = new ExpandoObject(); book.guid = Guid.NewGuid(); book.bookPrice = 32.55; book.name = null; CustomJsonConverter convert = new CustomJsonConverter(); convert.ProperyNameConverter = o => { return string.Concat(o, "$"); }; convert.PropertyNullValueReplaceValue = string.Empty; convert.PropertyNameCase = ConverterPropertyNameCase.PascalCase; string str = JsonConvert.SerializeObject(book, convert);

上面的代码将dynamic动态类型转换为JSON,同时将属性名末尾添加一个$符号,将null转为空字符串,同时将属性名称首字母大写使用PascalCase规则输出,输出如下内容:

{ "Guid$": "e13dfaf4-f4e8-441e-b6ba-f74ac210103a", "BookPrice$": 32.55, "Name$": "" }

同样,支持反序列化,将字符串反序列化为静态对象或者动态对象,规则同样适用。

string json = @"{ 'guid$': 'e13dfaf4-f4e8-441e-b6ba-f74ac210103a', 'bookPrice$': 32.55, 'name$': null }"; CustomJsonConverter convert = new CustomJsonConverter(); convert.ProperyNameConverter = o => { return o.Remove(o.Length - 1); }; convert.PropertyNameCase = ConverterPropertyNameCase.PascalCase; convert.PropertyNullValueReplaceValue = "NullValue"; dynamic book = JsonConvert.DeserializeObject<dynamic>(json, convert); Console.WriteLine("BookGuid={0}",book.Guid); Console.WriteLine("BookPrice={0}", book.BookPrice); Console.WriteLine("BookName={0}", book.Name);

将一段不符合系统规定的JSON反序列化为规则的对象,属性首字母采用PascalCase规则,用NullValue替换null值,输出后的结果:

BookGuid=e13dfaf4-f4e8-441e-b6ba-f74ac210103a BookPrice=32.55 BookName=NullValue

由于时间关系,自定义转换器时未经过大量的测试,如果您遇到问题,可联系博主修改,下面是转换器下载地址。

零度下载