Json.net的高级用法

在前后端使用Json进行数据交互的时候,很多情况下我们定义的实体类与前端所需要的Json格式的字段或者值并不能保持一致,所以我们需要在尽量改动小的情况下以满足以上场景;

所以这篇写一下关于Json.net的一些小操作。

我们有以下实体类

private class Studet
{
    public string name { get; set; }
    public int age { get; set; }
    public string idCard { get; set; }
    public DateTime birthday { get; set; }
    public List<hobby> hobbys { get; set; }
}
private class hobby
{
    public int sort { get; set; }
    public string desc { get; set; }
}

//初始化赋值
Studet student = new Studet();
student.name = "张三";
student.age = 20;
student.idCard = "1234567890";
student.birthday = new DateTime(2021, 1, 1);
List<hobby> list = new List<hobby>();
list.Add(new hobby { desc = "写字", sort = 1 });
list.Add(new hobby { desc = "游泳", sort = 2 });
student.hobbys = list;

如果直接序列化成Json的话,是如下数据

//Newtonsoft.Json.Formatting.Indented这个输出的json数据是格式化之后的
string json = JsonConvert.SerializeObject(student, Newtonsoft.Json.Formatting.Indented);
Console.WriteLine(json);
//输出
{
  "name": "张三",
  "age": 20,
  "idCard": "1234567890",
  "birthday": "2021-01-01T00:00:00",
  "hobbys": [
    {
      "sort": 1,
      "desc": "写字"
    },
    {
      "sort": 2,
      "desc": "游泳"
    }
  ]
}

显而易见,我们遇到了第一个问题,birthday时间格式,输出出来的并不是我们常用的格式,在不对类进行改变的情况下,我们可以使用下面的方式对时间数据进行格式化

//DateTimeFormat可以直接写要生成的时间格式
IsoDateTimeConverter timeFormat = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd" };
string json = JsonConvert.SerializeObject(student, Newtonsoft.Json.Formatting.Indented, timeFormat);

再介绍下修饰类的两个特性:

//该类所有成员都不会被序列化,添加了JsonProperty特性的可以
[JsonObject(MemberSerialization.OptIn)]
private class Studet
{}

//该类所有公有成员会被序列化
[JsonObject(MemberSerialization.OptOut)]
private class Studet
{}

介绍一下用法:假如我们的Studet类添加了OptIn特性,则使用序列化的时候,是没有任何数据的,但如果对字段也添加了JsonProperty特性,则有此特性的是可以被序列化的;

如我们上面的类只想输出name和age的话

[JsonObject(MemberSerialization.OptIn)]
private class Studet
{
    [JsonProperty]
    public string name { get; set; }
    [JsonProperty]
    public int age { get; set; }
    public string idCard { get; set; }
    public DateTime birthday { get; set; }
    public List<hobby> hobbys { get; set; }
}
string json = JsonConvert.SerializeObject(student, Newtonsoft.Json.Formatting.Indented);
//输出
{"name":"张三","age":20}

如果我们除了idcard都要输出的话

[JsonObject(MemberSerialization.OptOut)]//也可不写,默认此模式
private class Studet
{
    public string name { get; set; }
    public int age { get; set; }
    [JsonIgnore]
    public string idCard { get; set; }
    public DateTime birthday { get; set; }
    public List<hobby> hobbys { get; set; }
}
string json = JsonConvert.SerializeObject(student, Newtonsoft.Json.Formatting.Indented);
//输出
{"name":"张三","age":20,"birthday":"2021-01-01","hobbys":[{"sort":1,"desc":"写字"},{"sort":2,"desc":"游泳"}]}

还可以自定义输出的字段名称

//加上此特性后,输出的值为Name:张三
[JsonProperty(PropertyName = "Name")]
public string name { get; set; }

除此之外,我们还可以忽略值为Null的数据

//若name值为Null,则不会输出
JsonSerializerSettings jsetting = new JsonSerializerSettings();
jsetting.NullValueHandling = NullValueHandling.Ignore;
string json = JsonConvert.SerializeObject(student, jsetting);

//也可以针对单个字段值为Null做处理
[JsonProperty(NullValueHandling=NullValueHandling.Ignore)]
public string name { get; set; }

End...

若上一篇和以上内容仍然未满足某些开发需求,建议可以去看看Newtonsoft.Json的源码,会带来很多惊喜的特性以及使用方式。

由简入繁,拿来即用

更多精彩,请关注微信公众号:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值