ASP.NET WEB API 中自定义对象的序列化 [重复]

Posted

技术标签:

【中文标题】ASP.NET WEB API 中自定义对象的序列化 [重复]【英文标题】:Serialization of custom objects in ASP.NET WEB API [duplicate] 【发布时间】:2015-04-25 23:27:51 【问题描述】:

ASP .NET WEB API 新手问题。

我有一个愚蠢的 web api 项目,没有模型,只有一个带有 get 方法的控制器。

get 方法使用专有对象模型 API 从外部数据库检索数据。

public class MyObjectController : ApiController


    private static IList<MyObject> list = new List<MyObject>();


    private MyObjectCollection GetData()
    
            return MyExternalDB.Query();
    

    // GET api/myobjects
    public IEnumerable<MyObject> Get()
    
        MyObjectCollection objcoll = GetData();
        IList<MyObject> list = objcoll.Cast<MyObject>().ToList();
        return list;
    

问题: 现在,项目构建没有错误,但是当我尝试通过 IE url api/myobjects 进行调试并将结果下载到 json 时,IE 无法显示“文件无法下载”。

我怀疑该对象未正确序列化为 json。使用包 Web Api Tracing 我可以看到以下异常

Newtonsoft.Json.JsonSerializationException: Self referencing loop detected for property 'Project' with type ...

问题

MyObject 不依赖于模型,而是基于在单独的 API 中定义的自定义类型。我是否应该期望序列化程序能够正常工作并将我的对象转换为 json(假设没有自引用循环问题)? 我应该如何处理 MyObject 摆脱自引用属性,以便它可以正确序列化为 json 响应?

【问题讨论】:

“我怀疑对象未正确序列化为 json” - 或者,您使用了错误的工具来测试 API。尝试Fiddler 而不是 IE。 【参考方案1】:

尝试添加

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html") );

到你的App_Start/WebApiConfig.cs 班级

这应该强制它,但正如评论的那样,您确实应该通过创建适当的请求来测试您的 API。有几个工具:

Postman(Chrome 插件)Fiddler

由于您的应用程序可能会创建请求并指定数据类型并处理它,因此您需要使用上述工具之一进行模拟。

【讨论】:

在遇到 google 的 Advanced REST Client 之后,我停止使用您提到的 2 个(好吧,fiddler 仍可用于其他目的)。 甜,我试试看!

以上是关于ASP.NET WEB API 中自定义对象的序列化 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET Web API 中为 Json.NET 设置自定义 JsonSerializerSettings?

asp.net中在Gridview中自定义一列操作,应该怎么做?

ASP.NET Web API:JSON 序列化循环引用

Asp.Net Web API 2第十三课——ASP.NET Web API中的JSON和XML序列化

ASP.Net Web API Xml 序列化问题

在 Asp.Net Web API 中将 JSON 反序列化为派生类型