自己用着还顺手.想放源码,又怕被拍砖.
先看下效果,大家支持,就放源码.//比如有这样几个对象
//学生
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的需要编写的,不足之处请大家指教.

解决方案 »

  1.   

    序列化类是用 json.net ?呵呵,想技术交流就不要怕被拍砖~
      

  2.   

    Serializer json = new Serializer();这个就是自己写的组件.
      

  3.   

    吼吼,不错。你可以在参考下 json.net 开源的~Product product = new Product();
     
    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);
      

  4.   

    json.net就是那个newtonsoft的吗?我以前用的1.3版,但是它控制不了广度,要转换的对象又太复杂,有次转个List<>,
    居然有800多k,把我惊着了,下决心自己弄一个玩玩.
      

  5.   

    json.net就是newtonsoft。可以指定属性和深度是你的特点。不过DataContract特性可以控制哪些属性要序列化,不过可以控制深度还是第一看到。不错
      

  6.   

    newtonsoft的和.net3.5自带的都可以通过特性来控制,只是特性得在编码阶段指定的,总是不太灵活.
    所以带了个运行时指定的,呵呵.
      

  7.   

    我还不知道json是什么 我去Google拉
      

  8.   

    组件解决了一些实际应用中的问题,但linq+匿名类型也可以做到。所以要看具体实现从效率方面考量。还一个需要注意的地方,就是转换后的json 的格式不是标准格式。
      

  9.   

    linq+匿名类型的确可以实现,
    只是匿名类型也是在编码阶段定义的,不能根据客户端的需要灵活的生成.
      

  10.   

    http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/5.gif
      

  11.   

    看这样子让我想到了XML序列化,也是要指定序列化的对象的类型,然后才对该对象序列化。
    只不过微软在XmlSerializer中加了限制,如果指定的Type不是要序列化对象的自身类或其基类,就无法完成序列化,而你是把这个限制去掉了,只要有相同属性名的就可以依据其结构完成序列化。
      

  12.   

    还有一点说明,本组件有支持dotnet1.1的版本。
    结账算了。
    如果以后哪位同学挖坟把这个帖子挖出来,或者被无良老板逼迫要实现有关的功能,
    可以联系[email protected].