• .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教程

  • 相关阅读:
    Strom在本地运行调试出现的错误
    能否通过六面照片构建3D模型?比如人脸,全身的多角度照片,生成3D模型。?
    怎么识别自己的眼型?眼型图片参照
    用opencv检测人眼并定位瞳孔位置
    仿射变换
    二维图像的三角形变换算法解释
    Labeled Faces in the Wild 人脸识别数据集
    【图像处理】计算Haar特征个数
    人脸识别技术大总结(1):Face Detection & Alignment
    基于Policy Gradient实现CartPole
  • 原文地址:https://www.cnblogs.com/newlifechou/p/8949377.html
Copyright © 2020-2023  润新知