AngularJS、MVC4、Web API、Json反序列化$ref
通过HttpResponseMessage,MVC4成功发送AngularJs控制器$scope of GetAllFolders() 收藏中的文件夹除其他外,还与照片类有关联。 文件夹可以是其他文件夹的文件夹(自引用)。 调试表明,MVC4端的一切正常,并返回了正确的详细信息 但通过Angular/Json,某些属性是$ref标记,无法看到,例如: 我不太在乎在FkPhotoId上创建一个方法调用,当我知道在第一个响应中已经发送了图像名称时,我就点击服务器获取图像名称 有什么想法吗 更新:解决方案 此代码已添加到global.asax中:(确保在start方法中引用它) 来自OP的分辨率(室内清洁-标记以便标记已应答) 此代码已添加到global.asax中:(确保在start方法中引用它)AngularJS、MVC4、Web API、Json反序列化$ref,json,asp.net-mvc-4,angularjs,asp.net-web-api,Json,Asp.net Mvc 4,Angularjs,Asp.net Web Api,通过HttpResponseMessage,MVC4成功发送AngularJs控制器$scope of GetAllFolders() 收藏中的文件夹除其他外,还与照片类有关联。 文件夹可以是其他文件夹的文件夹(自引用)。 调试表明,MVC4端的一切正常,并返回了正确的详细信息 但通过Angular/Json,某些属性是$ref标记,无法看到,例如: 我不太在乎在FkPhotoId上创建一个方法调用,当我知道在第一个响应中已经发送了图像名称时,我就点击服务器获取图像名称 有什么想法吗 更新:解
再加上我的两分钱。我的代码中有一行额外的代码,这也导致了这个问题
config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
感谢digger69提供了这个答案。我厌倦了看到这个答案“只需禁用东西并解决它。”它是懒惰的,它是错误的,并且难以置信地降低了保留这些数据的有用性 这是一个由三部分组成的答案。第一部分是禁用集合引用并仅保留对象 在我的例子中,我想不出一个场景,在这个场景中,我将共享集合引用,而额外的代码是混乱的。如果需要集合引用,请编写消费FE逻辑。不要只是禁用它。碰巧我不需要它
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling=Newtonsoft.Json.ReferenceLoopHandling.Serialize;
config.Formatters.JsonFormatter.SerializerSettings.preserverencesshandling=Newtonsoft.Json.preserverencesshandling.Objects;
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver=新的CamelCasePropertyNamesContractResolver();
第二部分在这里。我从另一个答案中得到了这个答案,并添加了一个缺失的调整。(这是原件):
函数解析引用(json){
如果(!json)
返回json;
if(typeof json=='string')
json=json.parse(json);
var byid={},//按id列出的所有对象
refs=[];//对无法解析的对象的引用
json=(函数递归(obj、prop、parent){
if(typeof obj!='object'| |!obj)//原语值
返回obj;
if(Object.prototype.toString.call(obj)='[Object Array]'){
对于(变量i=0;i }
请添加您的解决方案作为答案——这样这个问题就不会出现在“未回答”列表中。你也可以(也应该)接受它。怎么做?在下面的文本框中,键入你的答案,单击“发布你的答案”按钮。(可选地从问题中删除您的解决方案)。然后单击答案旁边的复选标记。
public static void ConfigureApi(HttpConfiguration config)
{
var json = config.Formatters.JsonFormatter;
config.Formatters.Remove(config.Formatters.XmlFormatter);
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
}
config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;