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

administrator / 2019/2/18 19:02 / 1 阅读 7142

在.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

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

零度下载

年入30万+的.NET Core学习路线?



发送评论 请先登录再发布评论