C# 将实体框架对象序列化为JSON

C# 将实体框架对象序列化为JSON,c#,javascript,json,entity-framework,C#,Javascript,Json,Entity Framework,这是可行的,但是当我尝试使用HttpContext.Current.Response.Write(serializer.Serialize(system))我得到以下错误: 序列化类型的对象时检测到循环引用 'System.Data.Metadata.Edm.AssociationType 我想要的是一个json对象,表示完整的as_系统对象,因此我不必手动映射每个属性。有什么办法解决这个问题吗?谢谢 不确定这是否有帮助,但尝试使用DataContractJsonSerializer而不是Jav

这是可行的,但是当我尝试使用
HttpContext.Current.Response.Write(serializer.Serialize(system))我得到以下错误:

序列化类型的对象时检测到循环引用 'System.Data.Metadata.Edm.AssociationType


我想要的是一个json对象,表示完整的as_系统对象,因此我不必手动映射每个属性。有什么办法解决这个问题吗?谢谢

不确定这是否有帮助,但尝试使用DataContractJsonSerializer而不是JavaScriptSerializer。据我所知,DataContractJsonSerializer比JavaScriptSerializer更受欢迎。

听起来EF并没有给你一个
的系统,而是给你一个带有一些EF goo的微妙的动态子类。如果这是正确的,我认为最简单的方法是使用类似于获取非EF副本的方法(进入
new ASSystem()
实例,不受EF的影响)。但是,有几个备选方案:

  • 您可以尝试将
    ASSystem
    标记为
    sealed
    ,从而取消EF注入自身的能力
  • 您可以编写一个自定义转换器,但这可能比映射需要更多的工作

您可以创建一个POCO对象,该对象可以包含您的数据并可以序列化。例如,定义:

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;
        }
    }
}
在代码中使用以下语句:

public class MySystem {
  public int SID {get; set;}
  public string Description {get; set;}
  public string SystemName {get; set;}
}
IQuerable sysList=来自ctx.AS\u系统中的s,其中s.SYSTEM\u ID==查询
选择new MySystem(){SID=s.SYSTEM\u ID,
Description=s.Description,SystemName=s.SystemName};
MySystem sys=sysList.First();

现在,您可以像示例中那样序列化
sys

试试这个;它对我有用

要返回[EF]中的JSON数据,请执行以下操作:

  • 将引用
    System.Runtime.Serialization
    添加到项目中
  • 编写如下代码:

  • 您还可以检查JSON字符串是否在处有效。

    如果您想将实体框架对象序列化为JSON,可以从中使用JSON.NET。为此,请从nuget安装JSON.NET并使用以下代码示例:

    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);
        }
    

    ReferenceLoopHandling.Ignore可以防止循环引用错误。

    我忘了提到im使用.net 3.5和VS2008。我找不到,我想这就是问题所在吧?:)我通常发现
    DataContractJsonSerializer
    提供了一些。。。在许多情况下都是非典型JSON。我通常比较幸运的是
    JavaScriptSerializer
    Json.NET
    有没有办法让EF生成一个包含所有列的类,这些列的属性都是正确的数据类型?@Johan yes EF 4.0支持POCO对象,EF 4.1默认使用POCO。我认为这会阻止循环引用,但如果不需要,则不会阻止不必要地加载相关实体。
    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);
        }
    
    return Newtonsoft.Json.JsonConvert.SerializeObject(results, Formatting.Indented, 
    new JsonSerializerSettings { 
        ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
    });