序列化里的xml,soap,binary在上一篇文章里面已经说过了,这篇主要说json。
json是目前非常流行的一种序列化数据的方式,很多api都采用的是json,结构简洁,容易理解,适用性强,逐渐代替之前的xml在各个数据传输和存储的领域的使用,比如VS Code的配置文件:
json格式的结构很简单,分号隔开的键值堆构成,逗号隔开,{}表示对象,[]表示集合,值可以是数字,字符串,布尔,数组,对象,null,其他的一些细节请看规范资料即可。
下面就说说json序列化的几种方式:
JavaScriptSerializer类
需要给项目引用System.Web.Extensions.dll
,命名空间是System.Web.Script.Serialization
,被序列化的类无需加任何特性
序列化和反序列化的代码如下:
JavaScriptSerializer js = new JavaScriptSerializer();
string json = js.Serialize(p);
Console.WriteLine(json);
Console.WriteLine("Serialization Done");
Person new_p = js.Deserialize<Person>(json);
Console.WriteLine(new_p.Name);
DataContractJsonSerializer类
需要引用System.Runtime.Serialization.dll
,命名空间System.Runtime.Serialization.Json
,被序列化的类需要加WCF数据契约一样的特性来显式声明。
[DataContract]
public class Person
{
[DataMember]
public string Name { get; set; }
[DataMember]
public int Age { get; set; }
[DataMember]
public string Major { get; set; }
}
序列化代码如下:
DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Person));
MemoryStream ms = new MemoryStream();
js.WriteObject(ms,p);
ms.Position = 0;
string json = Encoding.Default.GetString(ms.ToArray());
Console.WriteLine(json);
MemoryStream ms_new = new MemoryStream(Encoding.Default.GetBytes(json));
Person pp = js.ReadObject(ms_new) as Person;
Console.WriteLine(pp.Name);
可以看出这个方式操作的是流,所以略微繁琐一些。
Json.NET类库,也就是大名鼎鼎的Newtonjson
Json.NEt类库,地址https://www.newtonsoft.com/json
功能很多很强大,我这里也只说一下最基本的。
直接通过Nuget可以安装到项目中。
这是它的命名空间,平常用到最多的是Newtonsoft.Json
这个。常用到的类是JsonConvert
工具类,方法DeserializeObject
,DeserializeObject<T>
,SerializeObject
。
直接上代码,很容易看,这种泛型方法可以直接转换成对象:
var json = JsonConvert.SerializeObject(p);
Console.WriteLine(json);
var pp = JsonConvert.DeserializeObject<Person>(json);
Console.WriteLine(pp.Name);
var jobj = JsonConvert.DeserializeObject(json) as JObject;
Console.WriteLine(jobj.GetType());
foreach (var item in jobj)
{
Console.WriteLine($"{item.Key}:{item.Value}");
}
而要将一个json结构很方便的转换为C#类,有专门的转化网站,但最简单的还是VS的选择性粘贴功能。
使用方法是:新建一个空cs文件,里面的东西都删除干净。然后复制json内容,选择VS的编辑菜单的选择性粘贴功能,里面有将json粘贴为类和将xml粘贴为类,有些转换过来不符合.NET规范的可以通过DataContract或者DAtaMemember进行注解。
当然,也可以直接使用dynamic类型来实现对应功能,优缺点其实也就是dynamic的优缺点。
var json = JsonConvert.SerializeObject(ps);
Console.WriteLine(json);
dynamic persons = JsonConvert.DeserializeObject<dynamic>(json);
foreach (var item in persons)
{
Console.WriteLine(item.Name);
}
参考文章