将实体框架对象序列化为JSON
本文关键字:JSON 序列化 对象 实体 框架 | 更新日期: 2023-09-27 18:11:21
public class GenericHandler : IHttpHandler
{
public class ASSystem
{
public string SID { get; set; }
public string Description { get; set; }
public string SystemName { get; set; }
}
public class ErrorObj
{
public string ErrorMessage { get; set; }
}
public void ProcessRequest(HttpContext context)
{
HttpContext.Current.Response.ContentType = "application/json";
HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
string query = HttpContext.Current.Request.QueryString["SID"];
SOFAEntities ctx = new SOFAEntities();
JavaScriptSerializer serializer = new JavaScriptSerializer();
try
{
AS_SYSTEM system = ctx.AS_SYSTEM.Where(s => s.SYSTEM_ID == query).First() as AS_SYSTEM;
if (system != null)
{
ASSystem sys = new ASSystem() { SID = system.SYSTEM_ID, Description = system.DESCRIPTION, SystemName = system.SYSTEM_NAME };
HttpContext.Current.Response.Write(serializer.Serialize(sys));
}
}
catch (Exception e)
{
HttpContext.Current.Response.Write(serializer.Serialize(new ErrorObj() { ErrorMessage = e.Message }));
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
这工作,但当我尝试使用HttpContext.Current.Response.Write(serializer.Serialize(system));
时,我得到以下错误:
在序列化类型的对象时检测到循环引用"System.Data.Metadata.Edm.AssociationType
我想要的是一个json对象代表完整的as_system对象,所以我不需要手动映射每个属性。有办法解决这个问题吗?谢谢!
如果你想将实体框架对象序列化为JSON,你可以使用JSON。NET从http://www.newtonsoft.com。为此,安装JSON。. NET中的nuget和使用下面的代码示例:
return Newtonsoft.Json.JsonConvert.SerializeObject(results, Formatting.Indented,
new JsonSerializerSettings {
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
});
ReferenceLoopHandling。忽略可以防止循环引用错误
听起来EF不是给你一个ASSystem
,而是一个带有EF goo的微妙动态子类。如果这是正确的,我认为这里最简单的事情是使用AutoMapper之类的东西来获取非EF副本(到new ASSystem()
实例中,不受EF影响)。但是,有一些替代方法:
- 您可以尝试将
ASSystem
标记为sealed
,以消除EF注入自身的能力 - 你编写一个自定义转换器并注册它-这可能比映射更多的工作,尽管
您可以创建一个包含您的数据并可以序列化的POCO对象。例如定义:
public class MySystem {
public int SID {get; set;}
public string Description {get; set;}
public string SystemName {get; set;}
}
在你的代码中使用这个语句:
IQuerable<MySystem> sysList = from s in ctx.AS_SYSTEM where s.SYSTEM_ID == query
select new MySystem(){SID = s.SYSTEM_ID,
Description = s.Description, SystemName = s.SystemName };
MySystem sys = sysList.First();
现在您可以像示例中那样序列化sys
了。
不确定这是否有帮助,但尝试使用DataContractJsonSerializer而不是JavaScriptSerializer。据我所知,DataContractJsonSerializer优于JavaScriptSerializer。
试试这个;
返回JSON数据[in EF]:
- 将
System.Runtime.Serialization
添加到项目中。 编写如下代码:
using System.Web.Script.Serialization;
public string getValuesJson()
{
JavaScriptSerializer js = new JavaScriptSerializer();
MyDBEntities ctx = new MyDBEntities();
var myValues = (from m in ctx.TestEntity
where (m.id == 22)
select m).ToList();
return js.Serialize(myValues);
}
您也可以在http://jsonlint.com/查看JSON字符串是否有效