string jsonstr= jsonconvert.serializeobject(entity);
eg:
a a=new a(); a.name=elain00; a.hobby=eat eat; string jsonstr=jsonconvert.serializeobject(a);
2.json反序列化
string jsonstr = jsonstring;
class model = jsonconvert.deserializeobject<class>(jsonstr);
eg:
string jsonstr='{\'name\':\'elaine00\',\'hobby\':\'eat eat\'}; a a=jsonconvert.deserializeobject<a>(jsonstr);
3.时间格式处理
isodatetimeconverter timeformat = new isodatetimeconverter(); timeformat.datetimeformat = yyyy-mm-dd hh:mm:ss; response.write(jsonconvert.serializeobject(bll.getmodellist(strwhere), newtonsoft.json.formatting.indented, timeformat));
4.扩展方法
public static class newtonjsonhelper { public static string serializeobject(this object obj) { return jsonconvert.serializeobject(obj, formatting.indented, new jsonserializersettings{ referenceloophandling = referenceloophandling.ignore}); } public static t deserializeobject<t>(this string data) { return jsonconvert.deserializeobject<t>(data, new jsonserializersettings { referenceloophandling = referenceloophandling.ignore }); } }
5.日期处理
public class logentry { public string details { get; set; } public datetime logdate { get; set; } }public void writejsondates() { logentry entry = new logentry { logdate = new datetime(2009, 2, 15, 0, 0, 0, datetimekind.utc), details = application started. }; // default as of json.net 4.5 string isojson = jsonconvert.serializeobject(entry); // {details:application started.,logdate:2009-02-15t00:00:00z} jsonserializersettings microsoftdateformatsettings = new jsonserializersettings { dateformathandling = dateformathandling.micro
public class limitpropscontractresolver : defaultcontractresolver { private string[] props = null; public limitpropscontractresolver(string[] props) { this.props = props; } protected override ilist<jsonproperty> createproperties(type type, memberserialization memberserialization) { ilist<jsonproperty> list = base.createproperties(type, memberserialization); isodatetimeconverter iso = new isodatetimeconverter() { datetimeformat = yyyy-mm-dd hh:mm:ss }; ilist<jsonproperty> listwithconver = new list<jsonproperty>(); foreach (var item in list) { if (props.contains(item.propertyname)) { if (item.propertytype.tostring().contains(system.datetime)) { item.converter = iso; } listwithconver.add(item); } } return listwithconver; } } }
softdateformat }; string microsoftjson = jsonconvert.serializeobject(entry, microsoftdateformatsettings); // {details:application started.,logdate:\/date(1234656000000)\/} string javascriptjson = jsonconvert.serializeobject(entry, new javascriptdatetimeconverter()); // {details:application started.,logdate:new date(1234656000000)}}
2.json反序列化string jsonstr = jsonstring; class model = jsonconvert.deserializeobject<class>(jsonstr); eg:string jsonstr='{\'name\':\'elaine00\',\'hobby\':\'eat eat\'};a a=jsonconvert.deserializeobject<a>(jsonstr);
一般是对于值类型的处理,通过设置jsetting.defaultvaluehandling的值来确定,该值为枚举类型.
defaultvaluehandling.ignore
序列化和反序列化时,忽略默认值
defaultvaluehandling.include
序列化和反序列化时,包含默认值
给成员设置默任值,用到defaultvalue(value)特性,当然别忘了引入命名空间system.componentmodel,假设员工的年龄默认值为30
[defaultvalue(30)] public int age { get; set; }
序列化时我想忽略为默认值的成员
staff jack = new staff { name = jack, age = 30, gender = male, departmentname = personnel department, leader = null }; var jsetting = new jsonserializersettings(); jsetting.defaultvaluehandling = defaultvaluehandling.ignore; string json = jsonconvert.serializeobject(jack,jsetting); console.writeline(json);
结果:
3.忽略某些属性
首先介绍json.net序列化的模式:optout 和 optin.
optout 默认值,类中所有公有成员会被序列化,如果不想被序列化,可以用特性jsonignore
optin 默认情况下,所有的成员不会被序列化,类中的成员只有标有特性jsonproperty的才会被序列化,当类的成员很多,但客户端仅仅需要一部分数据时,很有用
假如客户仅仅需要员工的姓名,此时
[jsonobject(newtonsoft.json.memberserialization.optin)] public class staff { [jsonproperty] public string name { get; set; } public int age { get; set; } public string gender { get; set; } public string departmentname { get; set; } public staff leader { get; set; } }
序列化:
staff jack = new staff { name = jack, age = 30, gender = male, departmentname = personnel department, leader = null }; string json = jsonconvert.serializeobject(jack);
结果:
如果客户不想要员工的领导信息
public class staff { public string name { get; set; } public int age { get; set; } public string gender { get; set; } public string departmentname { get; set; } [jsonignore] public staff leader { get; set; } }
序列化:
staff tom = new staff { name = tome, age = 42, gender = male, departmentname = personnel department}; staff jack = new staff { name = jack, age = 30, gender = male, departmentname = personnel department, leader = tom }; string json = jsonconvert.serializeobject(jack); console.writeline(json);
结果:
4.支持非公共成员
json.net序列化对象时,默认情况下仅仅序列化公有成员,如果想要非公有成员也被序列化,就要在该成员上加特性jsonproperty
5.日期处理
jsonconverters会在序列化和反序列化时被用到。jsonconverters允许手动对json的控制。当json的结构很复杂和你想改变一个类型怎么样被序列化时,这是非常有用的。当一个jsonconverters被添加到jsonserializer时,它会检查每一要被序列化和反序列化的值,并返回canconvert,如果为true,则jsonconverter读和写这个值;需要注意的是,虽然jsonconverter能够使你可以完全的控制json的值,但是很多的json.net序列化的特性被限制,像是类型名称和引用处理。所有的jsonconvert都在命名空间 newtonsoft.json.converters下
5.1isodatetimeconverter 和 javascriptdatetimeconverter
这是json.net中自带的两个处理日期的类,默认是isodatetimeconverter ,它的格式是yyyy'-'mm'-'dd't'hh':'mm':'ss.fffffffk.另一个是javascripttimeconverter,它的格式是 new date(ticks),其实返回的是一个javascript的date对象.
有两种方式来应用jsonconverter,改变json序列化和反序列化的行为.
5.1.1如果你要序列化的日期格式是统一的,可以考虑如下方式
假设我们为员工添加两个日期类型的成员,出生日期和入职日期
public class staff { public string name { get; set; } public int age { get; set; } public string gender { get; set; } public string departmentname { get; set; } public staff leader { get; set; } public datetime birthdate { get; set; } public datetime employmentdate { get; set; } }
我们的客户要求日期类型的成员返回javascript的日期对象
staff jack = new staff { name = jack, age = 30, gender = male, departmentname = personnel department, birthdate = new datetime(1982,2,12), employmentdate = new datetime(2010,12,12) }; string json = jsonconvert.serializeobject(jack,new javascriptdatetimeconverter()); console.writeline(json);
结果:
5.1.2如果想要不同的日期类型成员序列化后,以不同的形式显示.
现在我们的客户要求出生日期以iso标准日期格式返回,入职日期以javascript的date对象格式返回,修改我们的员工类
public class staff { public string name { get; set; } public int age { get; set; } public string gender { get; set; } public string departmentname { get; set; } public staff leader { get; set; } [jsonconverter(typeof(isodatetimeconverter))] public datetime birthdate { get; set; } [jsonconverter(typeof(javascriptdatetimeconverter))] public datetime employmentdate { get; set; } }
是的,通过特性jsonconverter来实现差异化的
序列化:
staff jack = new staff { name = jack, age = 30, gender = male, departmentname = personnel department, birthdate = new datetime(1982,2,12), employmentdate = new datetime(2010,12,12) }; string json = jsonconvert.serializeobject(jack); console.writeline(json);
结果:
5.2自定义日期格式
客户现在提出要求,希望得到的日期格式是符合中国人习惯的格式.要求返回的格式是2012年4月20日.挑战来了,没有挑战就没有进步,我喜欢挑战.光说是没有用的!先分析一下怎么解决这个问题.我考虑了两种思路.
思路一:
研究了一下上面两个日期处理类,发现他们都是继承了基类datetimeconverterbase,所以我们可以参考isodatetimeconverter的实现方式,自己新建一个处理日期格式的转换器类.这种方式的缺点是可能要花大量的时间去研究,比较费时费力.优点就是可以对日期格式随心所欲的控制.
思路二:
我又研究了一下isodatetimeconverter,发现它的日期格式其实是由于内部defaultdatetimeformat = yyyy'-'mm'-'dd't'hh':'mm':'ss.fffffffk导致,而它也提供了修改日期样式的属性datetimeformat,只要我们按照这种格式来写就ok了.
staff jack = new staff { name = jack, age = 30, gender = male, departmentname = personnel department, birthdate = new datetime(1982,2,12), employmentdate = new datetime(2010,12,12) }; isodatetimeconverter dtconverter = new isodatetimeconverter { datetimeformat = yyyy'年'mm'月'dd'日' }; string json = jsonconvert.serializeobject(jack,dtconverter); console.writeline(json);
结果:
6.faq
1.如何自定义序列化的字段名称?
默认情况下,json.net序列化后结果中的字段名称和类中属性的名称一致.如果想自定义序列化后的字段名称,可以使用jsonproperty.例如:
public class person { public int id { get; set; } public string name { get; set; } }
默认序列化的结果为: {id:1,name:杨过},如果不想用默认的字段名称,可以使用如下方式:
public class person { [jsonproperty(propertyname = personid)] public int id { get; set; } [jsonproperty(propertyname = personname)] public string name { get; set; } }
这样序列化的结果为:{personid:1,personname:杨过}
以上就是newtonsoft.json 序列化和反序列化 时间格式的详细内容。
