实现对象JSON序列化方式有:反射和不用反射。
下面是不用反射的实现方式:
1.Test类,需要实现JSON序列化的类,这个类需要实现ToJson()方法,当然你可以写一个IJson接口让每个实现ToJson()方法的类继承IJson接口,接口可以定义成public interface IJson{string ToJson();}。
public class Test : BaseModel<Test> { public string ID { get; set; } public string Name { get; set; } //public string ToJson() //{ // return "{'ID':'" + this.ID + "','Name':'" + this.Name + "'}"; //} }
其实这ToJson方法可写在一个基类里,实现代码如下
public abstract class BaseModel<TYPE> where TYPE : BaseModel<TYPE>, new() { public virtual string ToJson() { TYPE instance = GetInstance(); StringBuilder sb = new StringBuilder(); sb.Append("{"); foreach (var property in typeof(TYPE).GetProperties()) { string name = property.Name; object value = property.GetValue(instance, null); sb.Append("'" + name + "':'" + value + "',"); } return sb.ToString().TrimEnd(',') + "}"; } private TYPE GetInstance() { TYPE instance = new TYPE(); instance = this as TYPE; return instance; } }
2.ListExtension类,这是一个List扩展类,有一个ToJson()扩展方法,实现List对象JSON序列化。
public static class ListExtension { public static string ToJson(this IList list) { StringBuilder sb = new StringBuilder(); sb.Append("["); foreach (var o in list) { string json = o.GetType().InvokeMember("ToJson", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod, null, o, null).ToString(); sb.Append(json + ","); } return sb.ToString().TrimEnd(',') + "]"; } }
3.测试用例
public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { List<Test> tests = new List<Test>() { new Test{ID="1",Name="Test1"}, new Test{ID="2",Name="Test2"} }; Response.Write(tests.ToJson()); } }
4.这种实现方式比用反射稍麻烦点,虽然每个需要JSON序列化的类手动写ToJson()方法,没有使用反射写一个方法来的方便,但是性能比反射要高些。