1.json序列化
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 序列化和反序列化 时间格式的详细内容。