2017-05-17 138 views
1

我試圖用下面的控制器返回JSON對象:如何返回一個對象並將其格式化爲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,類型ITEMTYPE,字典2 previousCollectionTypes) at System.Runtime.Serialization.DataContract.GetNonDCTypeStableName(Type type, Dictionary 2個previousCollectionTypes)在 System.Runtime.Serialization.DataContract.GetStableName(類型類型, 字典2 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, Dictionary 2 previousCollectionTypes,布爾& hasDataContract)處 System.Runtime.Seria System.Runtime.Serialization.DataContract.GetCollectionStableName(類型 類型,類型ITEMTYPE,Dictionary`2 previousCollectionTypes, CollectionDataContractAttribute & collectionContractAttribute) lization.CollectionDataContract.CollectionDataContractCriticalHelper..ctor(類型 類型,CollectionKind種類,類型ITEMTYPE,MethodInfo的 getEnumeratorMethod,字符串serializationExceptionMessage,字符串 deserializationExceptionMessage)在 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構造,布爾 isConstructorCheckRequired)處 System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract System.Runtime.Serialization.CollectionDataContract.IsCollectionOrTryCreate(類型 類型,布爾tryCreate,DataContract & dataContract,類型& ITEMTYPE, 布爾constructorRequired,布爾skipIfReadOnlyContract) (的Int32 ID,類型句柄的RuntimeTypeHandle,類型型)在 System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation(的Int32 ID,類型句柄的RuntimeTypeHandle,類型型)在 System.Runtime.Serialization.DataContractSerializer.GetDataContract(DataContract declaredTypeCont RACT,類型的declaredType,類型的objectType)處 System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator 作家,對象圖,DataContractResolver System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator 作家,對象圖,DataContractResolver dataContractResolver) System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer,Object graph,DataContractResolver dataContractResolver)at 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 的CancellationToken)---從先前位置棧跟蹤其中 拋出異常---在 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); 
     } 


    } 
+0

試試這個:'return Ok(JsonConvert.SerializeObject(result,Formatting.Indented))''。 'JsonConvert'對象位於'Newtonsoft.Json'命名空間中,因此您可能需要添加引用和/或使用語句。 – user1429080

回答

1

添加到您的WebApiConfig

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

如果你仍然遇到相同的異常,看看this answer,看看是否有幫助。

事實證明,錯誤是由事實,我不得不從的NuGet安裝 的Microsoft Web API包,其中包括 Json.NET引起的。卸載後,它工作正常。

這可能是您的答案 - 如果沒有,請查看您已安裝(您不需要)的其他軟件包 並將其刪除。

相關問題