前言:由于近期在与ERP对接接口中,需要使用Json传递数据,故在网上查询和自己做了实例测试,得出以下生成与解析Json字符串的总结:
一 . 原始方式:按照JSON字符串格式自己来生成与解析。
二 . 通用方式:使用开源的类库 Newtonsoft.Json(使用该方法首先需在“管理NuGet程序包“中下载:“Newtonsoft.Json”:程序包)
1>实现对象的序列化和反序列化
//首先新建对象Model
class Class{ public int id { get; set; } public string name { get; set; } }
class Student{public int id { get; set; } public string name { get; set; } public Class Class { get; set; } }
* 序列化 (使用方法:public static string SerializeObject([NullableAttribute(2)] object value);)
Student stu = new Student();//新建对象实例 stu.id = 1; stu.name = "张三"; stu.Class = new Class() { id = 1, name = "终极一班" }; string json1 = JsonConvert.SerializeObject(stu);//将对象序列化,生成Json字符串 Console.WriteLine(json1);
结果:json1 : {"id":1,"name":"张三","Class":{"id":1,"name":"终极一班"}}
*反序列化 (使用方法:public static T DeserializeObject<[NullableAttribute(2)]T>(string value);)
Student stu2 = JsonConvert.DeserializeObject<Student>(json1);
2>匿名对象的序列化,反序列化
//匿名对象的解析, //匿名独享的类型 obj.GetType().Name: "<>f__AnonymousType0`2" var obj = new { ID = 2, Name = "李四" }; string json3 = JsonConvert.SerializeObject(obj);//-------------------------------------------------------------------------------------------------------------序列化 Console.WriteLine(json3); object obj2 = JsonConvert.DeserializeAnonymousType(json3, obj); object id = obj2.GetType().GetProperty("ID").GetValue(obj2);//.GetType()--获取匿名类型 .GetProperty()--获取匿名类型参数 .GetValue()--获取参数值 Console.WriteLine(obj2.GetType().GetProperty("ID").GetValue(obj2)); object obj3 = JsonConvert.DeserializeAnonymousType(json3, new { ID = default(int), Name = default(string) });//------------------------------------------------反序列化
//匿名对象解析,可以传入现有类型,进行转换 Student stu3 = new Student(); stu3 = JsonConvert.DeserializeAnonymousType(json3, new Student());//匿名对象转换成现有对象 Console.WriteLine(stu3.name);
JSON生成实体类工具:点击>>
三 . 内置方式:使用.NET Framework 3.5/4.0中提供的System.Web.Script.Serialization命名空间下的JavaScriptSerializer类进行对象的序列化与反序列化,很直接。
Project p1 = new Project() { Input = "stone", Output = "gold" }; JavaScriptSerializer serializer = new JavaScriptSerializer(); string jsonStr = serializer.Serialize(p1); //序列化:对象=>JSON字符串 Response.Write(jsonStr); Project p2 = serializer.Deserialize<Project>(jsonStr); //反序列化:JSON字符串=>对象 Response.Write(p1.Input + "=>" + p2.Output);
注意:如果使用的是VS2010,则要求当前的工程的 Target Framework要改成.Net Framework 4,不能使用Client Profile。当然这个System.Web.Extensions.dll主要是Web使用的,直接在Console工程中用感觉有点浪费资源。
此外,从最后一句也可以看到,序列化与反序列化是深拷贝的一种典型的实现方式。
备注:
json格式字符串转换为实体类,大括号{}表示对象,[]数组表示列表。