自己用着还顺手.想放源码,又怕被拍砖.
先看下效果,大家支持,就放源码.//比如有这样几个对象
//学生
class Student
{
public int ID { get; set; }
public string Code { get; set; }
public string Name { get; set; }
public ClassInfo Class { get; set; }
public List<Speciality> Specials { get; set; } public Student(int id, string code, string name, ClassInfo cls)
{
this.ID = id;
this.Code = code;
this.Name = name;
this.Class = cls;
}
}
//班级
class ClassInfo
{
public int ID { get; set; }
public string Name { get; set; }
public Speciality Special { get; set; }
public ClassInfo(int id, string name, Speciality spec)
{
this.ID = id;
this.Name = name;
this.Special = spec;
}
}
//专业
class Speciality
{
public int ID { get; set; }
public string Name { get; set; }
public Speciality(int id, string name)
{
this.ID = id;
this.Name = name;
}
}Student需要被转换为json发到客户端,简单的可以这样转//定义对象
Serializer json = new Serializer();
ClassInfo cls = new ClassInfo(1, "201001班", new Speciality(1, "计算机专业"));
Student stu = new Student(1, "20100001", "张三", cls);
stu.Specials = new List<Speciality>();
stu.Specials.Add(new Speciality(2, "英语专业"));
stu.Specials.Add(new Speciality(3, "心理学专业"));//全部转换
Console.WriteLine(json.Serialize(stu));/*输出
{ID:1,Code:'20100001',Name:'张三',Class:{ID:1,Name:'201001班',Special:{ID:1,Name:'计算机专业'}},Specials:[{ID:2,Name:'英语专业'},{ID:3,Name:'心理学专业'}]}
*/
可很多时候,我们并不需要它的全部属性,可能只需要ID,Code和Name就够了.Console.WriteLine(json.Serialize(stu, new string[] { "ID", "Code", "Name" }));/*输出
{ID:1,Code:'20100001',Name:'张三'}
*///还可能会有各种各样的需求.
Console.WriteLine(json.Serialize(stu, new string[] { "Name", "Class" }));
/*只要Name和Class的全部属性
{Name:'张三',Class:{ID:1,Name:'201001班',Special:{ID:1,Name:'计算机专业'}}}
*/Console.WriteLine(json.Serialize(stu, new string[] { "*", "Class.Name", "Specials.Name" }));
/*只要Student的全部普通属性(不是子对象的属性,可以有星号来通配)
{ID:1,Code:'20100001',Name:'张三',Class:{Name:'201001班'},Specials:[{Name:'英语专业'},{Name:'心理学专业'}]}
*/Serializer js1 = new Serializer(1);//只转换一级,更深级的子对象用js空对象来替代
Console.WriteLine(js1.Serialize(stu));
/*输出
{ID:1,Code:'20100001',Name:'张三',Class:{},Specials:[]}
*/Serializer js2 = new Serializer(2);//只转换二级.
Console.WriteLine(js2.Serialize(stu));
/*输出,Student的Class和Specials属于第二级,被转换了,Class的Special属于第三级,不转换.
{ID:1,Code:'20100001',Name:'张三',Class:{ID:1,Name:'201001班',Special:{}},Specials:[{ID:2,Name:'英语专业'},{ID:3,Name:'心理学专业'}]}
*/还没有写反序列化的部分,估计被简化了的序列化对象可能转不回来了.
主要是针对项目上ajax的需要编写的,不足之处请大家指教.
先看下效果,大家支持,就放源码.//比如有这样几个对象
//学生
class Student
{
public int ID { get; set; }
public string Code { get; set; }
public string Name { get; set; }
public ClassInfo Class { get; set; }
public List<Speciality> Specials { get; set; } public Student(int id, string code, string name, ClassInfo cls)
{
this.ID = id;
this.Code = code;
this.Name = name;
this.Class = cls;
}
}
//班级
class ClassInfo
{
public int ID { get; set; }
public string Name { get; set; }
public Speciality Special { get; set; }
public ClassInfo(int id, string name, Speciality spec)
{
this.ID = id;
this.Name = name;
this.Special = spec;
}
}
//专业
class Speciality
{
public int ID { get; set; }
public string Name { get; set; }
public Speciality(int id, string name)
{
this.ID = id;
this.Name = name;
}
}Student需要被转换为json发到客户端,简单的可以这样转//定义对象
Serializer json = new Serializer();
ClassInfo cls = new ClassInfo(1, "201001班", new Speciality(1, "计算机专业"));
Student stu = new Student(1, "20100001", "张三", cls);
stu.Specials = new List<Speciality>();
stu.Specials.Add(new Speciality(2, "英语专业"));
stu.Specials.Add(new Speciality(3, "心理学专业"));//全部转换
Console.WriteLine(json.Serialize(stu));/*输出
{ID:1,Code:'20100001',Name:'张三',Class:{ID:1,Name:'201001班',Special:{ID:1,Name:'计算机专业'}},Specials:[{ID:2,Name:'英语专业'},{ID:3,Name:'心理学专业'}]}
*/
可很多时候,我们并不需要它的全部属性,可能只需要ID,Code和Name就够了.Console.WriteLine(json.Serialize(stu, new string[] { "ID", "Code", "Name" }));/*输出
{ID:1,Code:'20100001',Name:'张三'}
*///还可能会有各种各样的需求.
Console.WriteLine(json.Serialize(stu, new string[] { "Name", "Class" }));
/*只要Name和Class的全部属性
{Name:'张三',Class:{ID:1,Name:'201001班',Special:{ID:1,Name:'计算机专业'}}}
*/Console.WriteLine(json.Serialize(stu, new string[] { "*", "Class.Name", "Specials.Name" }));
/*只要Student的全部普通属性(不是子对象的属性,可以有星号来通配)
{ID:1,Code:'20100001',Name:'张三',Class:{Name:'201001班'},Specials:[{Name:'英语专业'},{Name:'心理学专业'}]}
*/Serializer js1 = new Serializer(1);//只转换一级,更深级的子对象用js空对象来替代
Console.WriteLine(js1.Serialize(stu));
/*输出
{ID:1,Code:'20100001',Name:'张三',Class:{},Specials:[]}
*/Serializer js2 = new Serializer(2);//只转换二级.
Console.WriteLine(js2.Serialize(stu));
/*输出,Student的Class和Specials属于第二级,被转换了,Class的Special属于第三级,不转换.
{ID:1,Code:'20100001',Name:'张三',Class:{ID:1,Name:'201001班',Special:{}},Specials:[{ID:2,Name:'英语专业'},{ID:3,Name:'心理学专业'}]}
*/还没有写反序列化的部分,估计被简化了的序列化对象可能转不回来了.
主要是针对项目上ajax的需要编写的,不足之处请大家指教.
解决方案 »
- 登录问题,谢谢大侠们
- c#多线程自动更新
- 在C#中,浏览图片时如何导出图片?
- 如何定义DataGridView只显示特定的项
- returnVaue什么意思?
- 有一个循环1000次的for循环,想在每次循环的时候停1毫秒,该怎么做?
- 急:各位高手,有关一个时间格式的问题,请帮忙解决
- 跪求路过的大哥们:把一个excel文件的a1~d4这块内容写到datagrid中去,有没有什么好办法??
- 如何使用ADO.Net获得SQLServer里的表的各列的数据类型
- 大家给点学C#的建议
- 我从来没有学习过asp.net,这是恶补一周写下的选择排序算法的演示,真的不知道哪里出错了,很着急啊,谢谢谢谢各位了~~
- 动态读取数据
product.Name = "Apple";
product.Expiry = new DateTime(2008, 12, 28);
product.Price = 3.99M;
product.Sizes = new string[] { "Small", "Medium", "Large" };
string output = JsonConvert.SerializeObject(product);
//{
// "Name": "Apple",
// "Expiry": "\/Date(1230375600000+1300)\/",
// "Price": 3.99,
// "Sizes": [
// "Small",
// "Medium",
// "Large"
// ]
//}
Product deserializedProduct = JsonConvert.DeserializeObject<Product>(output);
居然有800多k,把我惊着了,下决心自己弄一个玩玩.
所以带了个运行时指定的,呵呵.
只是匿名类型也是在编码阶段定义的,不能根据客户端的需要灵活的生成.
只不过微软在XmlSerializer中加了限制,如果指定的Type不是要序列化对象的自身类或其基类,就无法完成序列化,而你是把这个限制去掉了,只要有相同属性名的就可以依据其结构完成序列化。
结账算了。
如果以后哪位同学挖坟把这个帖子挖出来,或者被无良老板逼迫要实现有关的功能,
可以联系[email protected].