代码改变世界

Ado.net Entity Framework实体转换成JSON

2010-11-24 10:06  watsonchia  阅读(867)  评论(2编辑  收藏  举报

这几天刚开始使用Ado.net Entity Framework,习惯性地使用DataContractJsonSerializer来序列化Entity Framework实体为JSON:

//using System.Runtime.Serialization.Json;
public static string ToJson(this object o)
{
    using (MemoryStream ms = new MemoryStream())
    {
        new DataContractJsonSerializer(o.GetType()).WriteObject(ms, o);
        return Encoding.UTF8.GetString(ms.ToArray());
    }
}

但是出现了实体[IsRefrence ]=true,不能序列化的错误。我没有把Entity Framework实体此属性修改为false,而是使用JavaScriptSerializer:

//using System.Web.Script.Serialization;
public static string ToJson(this object o)
{
    JavaScriptSerializer s = new JavaScriptSerializer();
    return s.Serialize(o);
}

ok,可以序列化。但是Entity Framework实体带有其他的属性和方法,序列化后的JSON有很多多余的信息,比如:

"EntityState":2,"EntityKey":{"EntitySetName":"StaffInfo","EntityContainerName":"DinnerOrderDbEntities","EntityKeyValues":[{"Key":"Oid","Value":1}],"IsTemporary":false}

我们可以在linq语句里构造新的对象再进行序列化:

var list = from s in dinnerContext.StaffInfo
             select new
             {
                 oid = s.Oid,
                 name = s.Name,
                 createdate = s.CreateDate
             };

return list.ToJson();

这样生成的JSON只有新构造对象里的字段,没有其他多余信息。