【问题标题】:How to return an object and format it as json?如何返回一个对象并将其格式化为 json?
【发布时间】:2017-05-17 02:42:07
【问题描述】:

我正在尝试使用以下控制器返回 JSON 对象:

    public async Task<IHttpActionResult> Get(string query)
    {
        var client = new HttpClient(new HttpClientHandler()
        {
            Credentials = new NetworkCredential("myuser", "NotSoSecret#1", "mydomain"),
        });
        var ipAddress = Dns.GetHostAddresses("myorgetc.com").ToList()[0];
        client.BaseAddress = new Uri(string.Format("http://{0}/myorg/api/data/v8.1/", ipAddress.ToString()));

        HttpResponseMessage response = await client.GetAsync(client.BaseAddress +"accounts"+ query);
        object result;

        if (response.IsSuccessStatusCode)
        {
            result = await response.Content.ReadAsAsync<object>();
            return Ok(result);
        }

        return NotFound();
    }      

它返回以下异常:

此 XML 文件似乎没有关联任何样式信息 用它。文档树如下所示。一个错误 已经发生了。类型 'Newtonsoft.Json.Linq.JToken' 是一个递归收集数据合约 不支持。考虑修改定义 集合 'Newtonsoft.Json.Linq.JToken' 以删除对 本身。 System.Runtime.Serialization.InvalidDataContractException 在 System.Runtime.Serialization.DataContract.ValidatePreviousCollectionTypes(类型 collectionType, Type itemType, Dictionary2 previousCollectionTypes) at System.Runtime.Serialization.DataContract.GetNonDCTypeStableName(Type type, Dictionary2 previousCollectionTypes) at System.Runtime.Serialization.DataContract.GetStableName(类型类型, Dictionary2 previousCollectionTypes, Boolean& hasDataContract) at System.Runtime.Serialization.DataContract.GetDefaultStableLocalName(Type type) at System.Runtime.Serialization.DataContract.GetDCTypeStableName(Type type, DataContractAttribute dataContractAttribute) at System.Runtime.Serialization.DataContract.GetStableName(Type type, Dictionary2 previousCollectionTypes, Boolean& hasDataContract) at System.Runtime.Serialization.DataContract.GetCollectionStableName(类型 type, Type itemType, Dictionary`2 previousCollectionTypes, CollectionDataContractAttribute&collectionContractAttribute) 在 System.Runtime.Serialization.CollectionDataContract.CollectionDataContractCriticalHelper..ctor(类型 类型、CollectionKind 种类、类型 itemType、MethodInfo getEnumeratorMethod,字符串 serializationExceptionMessage,字符串 反序列化异常消息)在 System.Runtime.Serialization.CollectionDataContract.CollectionDataContractCriticalHelper..ctor(类型 类型、CollectionKind 种类、类型 itemType、MethodInfo getEnumeratorMethod、MethodInfo addMethod、ConstructorInfo 构造函数)在 System.Runtime.Serialization.CollectionDataContract..ctor(类型类型, CollectionKind 种类,类型 itemType,MethodInfo getEnumeratorMethod, MethodInfo addMethod, ConstructorInfo 构造函数, Boolean isConstructorCheckRequired) 在 System.Runtime.Serialization.CollectionDataContract.IsCollectionOrTryCreate(类型 type, Boolean tryCreate, DataContract& dataContract, Type& itemType, Boolean constructorRequired, Boolean skipIfReadOnlyContract) at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract(Int32 id, RuntimeTypeHandle typeHandle, Type type) at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type) at System.Runtime.Serialization.DataContractSerializer.GetDataContract(DataContract 声明类型合同,类型声明类型,类型对象类型)在 System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator 作家,对象图,DataContractResolver dataContractResolver)在 System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator 作家,对象图,DataContractResolver dataContractResolver)在 System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator 作家,对象图,DataContractResolver dataContractResolver)在 System.Runtime.Serialization.DataContractSerializer.WriteObject(XmlWriter 作家,对象图)在 System.Net.Http.Formatting.XmlMediaTypeFormatter.WriteToStream(类型 类型、对象值、流 writeStream、HttpContent 内容)在 System.Net.Http.Formatting.XmlMediaTypeFormatter.WriteToStreamAsync(类型 类型、对象值、流 writeStream、HttpContent 内容、 TransportContext transportContext, CancellationToken cancelToken) --- 从上一个位置结束堆栈跟踪,其中 抛出异常---在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Web.Http.Owin.HttpMessageHandlerAdapter.d__13.MoveNext()

我做错了什么?如何在开发时不知道确切结构的情况下返回 JSON 对象?

这是我的启动:

public static class Startup
    {
        // This code configures Web API. The Startup class is specified as a type
        // parameter in the WebApp.Start method.

        public static void ConfigureApp(IAppBuilder appBuilder)
        {
            // Configure Web API for self-host. 
            HttpConfiguration config = new HttpConfiguration();
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            var container = new UnityContainer();
            container.RegisterType<IAccountsRepository, AccountsRepository>(new HierarchicalLifetimeManager());
            container.RegisterType<IAccountService, AccountService>(new HierarchicalLifetimeManager());
            config.DependencyResolver = new UnityResolver(container);

            appBuilder.UseWebApi(config);
        }


    }

【问题讨论】:

  • 试试这个:return Ok(JsonConvert.SerializeObject(result, Formatting.Indented))JsonConvert 对象位于 Newtonsoft.Json 命名空间中,因此您可能需要添加引用和/或 using 语句。

标签: c# .net json asp.net-web-api visual-studio-2017


【解决方案1】:

将此添加到您的WebApiConfig

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

如果您仍然遇到同样的异常,请查看this answer 看看是否有帮助。

事实证明,这个错误是由于我有一个 从 NuGet 安装的 Microsoft Web API 包,其中包括 json.net。卸载后就可以正常使用了。

这可能是您的答案 - 如果不是,请查看其他哪些软件包 您已安装(您不需要)并删除它们。

【讨论】:

    猜你喜欢
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多