Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS、MVC4、Web API、Json反序列化$ref_Json_Asp.net Mvc 4_Angularjs_Asp.net Web Api - Fatal编程技术网

AngularJS、MVC4、Web API、Json反序列化$ref

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上创建一个方法调用,当我知道在第一个响应中已经发送了图像名称时,我就点击服务器获取图像名称 有什么想法吗 更新:解

通过HttpResponseMessage,MVC4成功发送AngularJs控制器$scope of GetAllFolders()

收藏中的文件夹除其他外,还与照片类有关联。

文件夹可以是其他文件夹的文件夹(自引用)。

调试表明,MVC4端的一切正常,并返回了正确的详细信息

但通过Angular/Json,某些属性是$ref标记,无法看到,例如:

我不太在乎在FkPhotoId上创建一个方法调用,当我知道在第一个响应中已经发送了图像名称时,我就点击服务器获取图像名称

有什么想法吗

更新:解决方案

此代码已添加到global.asax中:(确保在start方法中引用它)

来自OP的分辨率(室内清洁-标记以便标记已应答) 此代码已添加到global.asax中:(确保在start方法中引用它)


再加上我的两分钱。我的代码中有一行额外的代码,这也导致了这个问题

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;