Newtonsoft.Json高级用法
Newtonsoft.Json介绍在做开发的时候,很多数据都是以Json格式传输的,而使用Json的时候,我们通常会涉及到几个序列化对象的使用:
基本用法Json.Net是支持序列化和反序列化DataTable、DataSet、Entity Framework和Entity的 private void Newtonsoft()
{
DataTable dt = new DataTable();
dt.Columns.Add("Name",Type.GetType("System.String"));
dt.Columns.Add("Sex",Type.GetType("System.String"));
dt.Columns.Add("Age",Type.GetType("System.Int32"));
dt.Columns.Add("PhoneNumber",Type.GetType("System.String"));
for (int i = 0; i < 3; i++)
{
DataRow dr = dt.NewRow();
dr["Name"] = "Name" + i;
dr["Sex"] = i % 2 == 0 ? "女" : "男";
dr["Age"] = 18 + i;
dr["PhoneNumber"] = "18233388888";
dt.Rows.Add(dr);
}
/*序列化DataTable*/
string json = JsonConvert.SerializeObject(dt);
/*反序列化DataTable*/
DataTable dtSource = JsonConvert.DeserializeObject<DataTable>(json);
foreach (DataRow item in dtSource.Rows)
{
string name = item["Name"].ToString();
string sex = item["Sex"].ToString();
int age = int.Parse(item["Age"].ToString());
string phoneNumber = item["PhoneNumber"].ToString();
}
}
DataSet、Entity Framework序列化和DataTable一样,这里就不过多介绍了。 高级用法
一、忽略某些属性
只有Name和PhoneNumber [JsonObject(MemberSerialization.OptIn)]
public class Person
{
[JsonProperty]
public string Name { get; set; }
public string Sex { get; set; }
public int Age { get; set; }
public string Address { get; set; }
[JsonProperty]
public string PhoneNumber { get; set; }
}
[JsonObject(MemberSerialization.OptOut)]
public class Person
{
public string Name { get; set; }
[JsonIgnore]
public string Sex { get; set; }
public int Age { get; set; }
[JsonIgnore]
public string Address { get; set; }
[JsonIgnore]
public string PhoneNumber { get; set; }
}
public class Person
{
public string Name { get; set; }
public string Sex { get; set; }
public int Age { get; set; }
public string Address { get; set; }
public string PhoneNumber { get; set; }
}
忽略没有赋值的属性: public class Person
{
public string Name { get; set; }
public string Sex { get; set; }
public int Age { get; set; }
[JsonProperty(NullValueHandling=NullValueHandling.Ignore)]
public string Address { get; set; }
public string PhoneNumber { get; set; }
}
public class Person
{
public string Name { get; set; }
public string Sex { get; set; }
public int Age { get; set; }
public string Address { get; set; }
public string PhoneNumber { get; set; }
private int Wife { get; set; }
public Person()
{
Wife = 3;
}
}
public class Person
{
public string Name { get; set; }
public string Sex { get; set; }
public int Age { get; set; }
public string Address { get; set; }
public string PhoneNumber { get; set; }
[JsonProperty]
private int Wife { get; set; }
public Person()
{
Wife = 3;
}
}
public class Person
{
public string Name { get; set; }
public string Sex { get; set; }
public DateTime Birthday { get; set; }
}
public class Person
{
public string Name { get; set; }
public string Sex { get; set; }
[JsonConverter(typeof(IsoDateTimeConverter))]
public DateTime Birthday { get; set; }
}
但实际使用过程中大多数使用的可能是yyyy-MM-dd或yyyy-MM-dd HH:mm:ss这两种格式的日期,解决办法可以是将DateTime类型转成string类型自己先格式化然后再序列化。其次,Json.Net提供了IsoDateTimeConvert日期转换这个类,可以通过JsonConverter实现相应的日期转换,效果跟不加JsonConverter是一样的,在此就不截图了,但这明显不是我们想要的结果,我们可以继承该类实现自己的日期格式 public class Person
{
public string Name { get; set; }
public string Sex { get; set; }
[JsonConverter(typeof(ChinaDateTimeConcerter))]
public DateTime Birthday { get; set; }
}
public class ChinaDateTimeConcerter : DateTimeConverterBase
{
private static IsoDateTimeConverter dtConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd" };
public override object ReadJson(JsonReader reader,Type objectType,object existingValue,JsonSerializer serializer)
{
return dtConverter.ReadJson(reader,objectType,existingValue,serializer);
}
public override void WriteJson(JsonWriter writer,object value,JsonSerializer serializer)
{
dtConverter.WriteJson(writer,value,serializer);
}
}
public class Person
{
public string Name { get; set; }
[JsonProperty(PropertyName = "MySex")]
public string Sex { get; set; }
[JsonProperty(PropertyName = "MyAge")]
public int Age { get; set; }
}
序列化后: 七、动态决定属性是否序列化 public class Person
{
public string Name { get; set; }
public string Sex { get; set; }
public int Age { get; set; }
public string Address { get; set; }
public string PhoneNumber { get; set; }
}
public class LimitPropsContractResolver : DefaultContractResolver
{
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);
//只保留清单列出的属性
return list.Where(p => props.Contains(p.PropertyName)).ToList();
}
}
使用自定义解析类,只输出Name、Sex、Age三个属性 总结Newtonsoft.Json序列化库替我们想了很多特性,也实现了很多特性,除了上面介绍的几种高级用法外,还有其它的特殊用法,可以去官网进行学习,我在学会了使用Newtonsoft.Json之后,非常想知道其内部是如何实现特性这一功能的,不知道大家有何感想。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |