文档章节

使用JSON.NET实现对象属性的格式化的自定义

o
 osc_8ieji7o1
发布于 2019/03/09 14:15
字数 517
阅读 19
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

在使用JSON.NET序列化对象时,希望能够对一些属性字段的格式自定义处理,经常遇到的便是日期格式的自定义,下面就给出例子。
如有一个Person类,实例化Person对象时,希望BirthDate的格式结果为“yyyy/MM//dd”或“yyyy-MM-dd”:
class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public DateTime BirthDate { get; set; }
}
6
6
 
1
class Person
2
{
3
    public string Name { get; set; }
4
    public int Age { get; set; }
5
    public DateTime BirthDate { get; set; }
6
}
第一种方法:
    给 JsonConvert.SerializeObject的方法传入自定义的格式化参数:
static void Main(string[] args)
{
    var me = new Person
    {
        Name = "Medit Ding",
        Age = 27,
        BirthDate = DateTime.Parse("1992-11-13")
    };

    var json1 = JsonConvert.SerializeObject(me);
    var json2 = JsonConvert.SerializeObject(me, new IsoDateTimeConverter { DateTimeFormat = "yyyy/MM/dd" });

    Console.WriteLine($"json1:\t{json1}\r\njson2:\t{json2}");
    Console.ReadKey();
}
15
15
 
1
static void Main(string[] args)
2
{
3
    var me = new Person
4
    {
5
        Name = "Medit Ding",
6
        Age = 27,
7
        BirthDate = DateTime.Parse("1992-11-13")
8
    };
9
10
    var json1 = JsonConvert.SerializeObject(me);
11
    var json2 = JsonConvert.SerializeObject(me, new IsoDateTimeConverter { DateTimeFormat = "yyyy/MM/dd" });
12
13
    Console.WriteLine($"json1:\t{json1}\r\njson2:\t{json2}");
14
    Console.ReadKey();
15
}
可以得到目标结果:

第二种方法:
    给目标属性添加自定义格式化特性:
class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    [JsonConverter(typeof(DateTimeConverter),"yyyy/MM/dd")]
    public DateTime BirthDate { get; set; }
}

class DateTimeConverter : IsoDateTimeConverter
{
    public DateTimeConverter()
        :base()
    {
        //Default datetime format
        DateTimeFormat = "yyyy-MM-dd HH:mm:ss";
    }

    public DateTimeConverter(string format)
        :base()
    {
        DateTimeFormat = format;
    }
}

....
static void Main(string[] args)
{
    var me = new Person
    {
        Name = "Medit Ding",
        Age = 27,
        BirthDate = DateTime.Parse("1992-11-13")
    };
    
    var json = JsonConvert.SerializeObject(me);

    Console.WriteLine($"json:\t{json}");
    Console.ReadKey();
}
40
40
 
1
class Person
2
{
3
    public string Name { get; set; }
4
    public int Age { get; set; }
5
6
    [JsonConverter(typeof(DateTimeConverter),"yyyy/MM/dd")]
7
    public DateTime BirthDate { get; set; }
8
}
9
10
class DateTimeConverter : IsoDateTimeConverter
11
{
12
    public DateTimeConverter()
13
        :base()
14
    {
15
        //Default datetime format
16
        DateTimeFormat = "yyyy-MM-dd HH:mm:ss";
17
    }
18
19
    public DateTimeConverter(string format)
20
        :base()
21
    {
22
        DateTimeFormat = format;
23
    }
24
}
25
26
....
27
static void Main(string[] args)
28
{
29
    var me = new Person
30
    {
31
        Name = "Medit Ding",
32
        Age = 27,
33
        BirthDate = DateTime.Parse("1992-11-13")
34
    };
35
    
36
    var json = JsonConvert.SerializeObject(me);
37
38
    Console.WriteLine($"json:\t{json}");
39
    Console.ReadKey();
40
}
    可以得到目标结果:
以上都是针对日期类型的格式化处理,至于其他类型的格式化应该时可以参考以上的。


o
粉丝 2
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.5K
6
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
4.1K
3
SQLServer实现split分割字符串到列

网上已有人实现sqlserver的split函数可将字符串分割成行,但是我们习惯了split返回数组或者列表,因此这里对其做一些改动,最终实现也许不尽如意,但是也能解决一些问题。 先贴上某大牛写的s...

cwalet
2014/05/21
9.6K
0
CDH5: 使用parcels配置lzo

一、Parcel 部署步骤 1 下载: 首先需要下载 Parcel。下载完成后,Parcel 将驻留在 Cloudera Manager 主机的本地目录中。 2 分配: Parcel 下载后,将分配到群集中的所有主机上并解压缩。 3 激...

cloud-coder
2014/07/01
6.8K
1

没有更多内容

加载失败,请刷新页面

加载更多

如何在Pandas的DataFrame中的行上进行迭代? - How to iterate over rows in a DataFrame in Pandas?

问题: I have a DataFrame from pandas: 我有一个来自熊猫的DataFrame : import pandas as pdinp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]df = pd.DataFrame(......

富含淀粉
41分钟前
20
0
与电商节伴生,平台销量榜单背后还有被低估的营销价值

文 | 曾响铃 来源 | 科技向令说(xiangling0815) 时至今日,电商节已经成为各巨头零售平台例行的活动,花样在不断创新,玩法也在不断涌现。 在这个过程中,伴随电商节的各种品牌、产品销量榜...

曾响铃
43分钟前
22
0
volatile关键字详解

前言 提到JAVA的并发编程,就不得不提volatile关键字,不管是在面试还是实际开发中,volatile关键字的使用都是一个应该掌握的技能。它之所以重要,是因为它和JAVA并发编程中会遇到三种重要问...

ls_cherish
今天
15
0
比继承更偏爱组成? - Prefer composition over inheritance?

问题: Why prefer composition over inheritance? 为什么更喜欢使用组合而不是继承? What trade-offs are there for each approach? 每种方法都有哪些取舍? When should you choose inher...

javail
今天
26
0
2020软件测试工程师史上最全面试题(内含答案)-看完BATJ面试官对你竖起大拇指!

以下是软件测试相关的面试题及答案,欢迎大家参考! 我不是至尊宝,也不是孙悟空,我只是那城墙下的一猿。  1、你的测试职业发展是什么?  测试经验越多,测试能力越高。所以我的职业发展是需...

程序员一凡
今天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部