.NET处理Json的几种方式

序列化里的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工具类,方法DeserializeObjectDeserializeObject<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);
}

参考文章

在C#中,Json的序列化和反序列化的几种方式总结

Json的序列化与反序列化

Json教程

posted @ 2018-04-26 12:02  xsz1234  阅读(25629)  评论(1编辑  收藏  举报