C# 将实体框架对象转换为JSON对象

C# 将实体框架对象转换为JSON对象,c#,asp.net,json,entity-framework,C#,Asp.net,Json,Entity Framework,我试图根据我的实体类型SYSTEM\u AUDIT\u SHEET,让一个通用处理程序发布一个JSONJ对象: SYSTEM_AUDIT_SHEET sheet = ctx.SYSTEM_AUDIT_SHEET .Where(s => s.SYSTEM_KEY == system_key_dec) .Select(s => s)

我试图根据我的实体类型
SYSTEM\u AUDIT\u SHEET
,让一个通用处理程序发布一个JSONJ对象:

SYSTEM_AUDIT_SHEET sheet = ctx.SYSTEM_AUDIT_SHEET
                              .Where(s => s.SYSTEM_KEY == system_key_dec)
                              .Select(s => s)
                              .OrderByDescending(s => s.AUDIT_SHEET_VERSION)
                              .First();

HttpContext.Current.Response.Write(serializer.Serialize(sheet));
但我得到了以下错误:

序列化类型的对象时检测到循环引用 “系统.数据.实体.动态验证.系统审计表”521A7B786A51FC0F83641182DD72C8DFE6C082418D30BBB977B03409A74CE17”


为什么我不能将实体转换为JSON?

您不能将引用自身的对象转换为JSON,因为这将创建一个无限长的JSON字符串

例如,以下伪代码无法工作,因为它设置了循环引用(Dog>>Bone>>Dog…):


通过谷歌搜索“json循环引用”,似乎有一些不错的解决方案。请参阅顶部的两个堆栈溢出链接。

问题可能是
系统审计工作表
包含引用类型为
系统审计工作表
的实例的属性,或者包含指向具有指向
系统审计工作表
实例指针的对象的属性。序列化这样一个指针循环将导致一个永远不会结束的序列化过程

在进行序列化之前,您需要将
系统审计工作表
转换为不(直接或间接)引用自身的类型。您可以创建一个全新的类型,并编写代码从您的
系统审计工作表
中实例化这样的类型(这里可能很方便)。但是,我倾向于发现,在大多数情况下,只使用匿名类型更容易:

SYSTEM_AUDIT_SHEET sheet = /*some sheet*/
var json = new {
  sheet.Id,
  sheet.RevisionNumber,
  sheet.Title
};
return serializer.Serialize(json);
编辑

如果您想使用AutoMapper并假设您的工作表看起来像

class SYSTEM_AUDIT_SHEET 
{
    public int Id { get; set; }
    public SYSTEM_AUDIT_SHEET SomeOtherAuditSheet { get;set;}
    public string Title { get;set;}
}
您可以创建如下类型

class JSON_SYSTEM_AUDIT_SHEET
{
    public int Id { get; set; }
    public int SomeOtherAuditSheetsId { get;set;}
    public string Title { get;set;}
}
当应用程序启动时(例如,在应用程序启动中),您可以配置AutoMapper:

AutoMapper.Mapper.CreateMap<SYSTEM_AUDIT_SHEET, JSON_SYSTEM_AUDIT_SHEET>()
  .ForMember(dest => dest.SomeOtherAuditSheetsId, opt => opt.MapFrom(src => src.SomeOtherAuditSheet.Id));
你可能想看看


希望这能有所帮助。

是的,但因为有大约30个属性,我不想手动操作。我想这就是automapper的作用吧?你能告诉我它是怎么使用的吗?+1表示自动制版机的使用。是否有人知道有一个现有的工具或模板会自动为此复制POCO?创建一个类似于要序列化的对象但没有循环引用的新类。从sheet对象填充该类中的数据并将其序列化。由于这类问题,直接序列化实体框架对象是一种不好的做法;答案是“使用JSON.Net”,它有几种解决这个问题的方法,不需要复制/粘贴类谷歌It不是一个很有帮助的答案。你能提供一个链接吗?我提供了一个答案和获取更多资料的方法。我在搜索页面上引用了多个链接。。。真正给出一个特定的谷歌搜索词是提供额外参考资料的最有效的方式。2.3.
AutoMapper.Mapper.CreateMap<SYSTEM_AUDIT_SHEET, JSON_SYSTEM_AUDIT_SHEET>()
  .ForMember(dest => dest.SomeOtherAuditSheetsId, opt => opt.MapFrom(src => src.SomeOtherAuditSheet.Id));
return AutoMapper.Mapper.Map<SYSTEM_AUDIT_SHEET , JSON_SYSTEM_AUDIT_SHEET >(sheet);