【发布时间】:2014-06-11 10:06:24
【问题描述】:
我正在尝试使用 WebApi 从我的数据库中获取员工列表,使用以下代码:这是我的客户端 MVC 应用程序的代码:
string u = "http://localhost:1411/api/EmployeeAPI";
Uri uri = new Uri(u);
HttpClient httpClient = new HttpClient();
Task<HttpResponseMessage> response = httpClient.GetAsync(uri);
Task.WaitAll(response);
HttpResponseMessage resposta = response.Result;
var msg = resposta.Content.ReadAsStringAsync().Result;
Employee[] employees = JsonConvert.DeserializeObject<Employee[]>(msg);
return View(employees);
这是我的 WebAPI 的代码:
public IEnumerable<Employee> GetEmployees()
{
return db.Employees.AsEnumerable();
}
但是这个错误不断弹出,我不明白为什么:
Cannot deserialize the current JSON object (e.g. {"name":"value"})
into type 'DataAccess.Employee[]' because the type requires a
JSON array (e.g. [1,2,3]) to deserialize correctly. To fix this error either
change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized
type so that it is a normal .NET type (e.g. not a primitive type like integer,
not a collection type like an array or List)
that can be deserialized from a JSON object.
JsonObjectAttribute can also be added to the type to force it to deserialize
from a JSON object. Path 'Message', line 1, position 11.
我的员工班级:
namespace DataAccess
{
using System;
using System.Collections.Generic;
public partial class Employee
{
public Employee()
{
this.Products = new HashSet<Product>();
}
public int EmployeeId { get; set; }
public string Title { get; set; }
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
public byte[] rowguid { get; set; }
public System.DateTimeOffset ModifiedDate { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
}
我的儿子
"{\"Message\":\"An error has occurred.\",\
"ExceptionMessage\":\"The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; charset=utf-8'.\",\
"ExceptionType\":\"System.InvalidOperationException\",\
"StackTrace\":null,\
"InnerException\":{\
"Message\":\"An error has occurred.\",\
"ExceptionMessage\":\"Self referencing loop detected with type 'System.Data.Entity.DynamicProxies.ProductSubCategory_9EC9A3706390DE6A3B51F713F0DDAC2162AFB5B3FAB8F8587C9A865333A7729A'.
Path '[0].Products[0].ProductSubCategory.ProductCategory.ProductSubCategories'.\",\
"ExceptionType\":\"Newtonsoft.Json.JsonSerializationException\",\
"StackTrace\":\"
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CheckForCircularReference(JsonWriter writer, Object value, JsonProperty property, JsonContract contract, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IWrappedCollection values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IWrappedCollection values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IWrappedCollection values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value)\r\n
at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value)\r\n at System.Net.Http.Formatting.JsonMediaTypeFormatter.<>c__DisplayClassd.b__c()\r\n at System.Threading.Tasks.TaskHelpers.RunSynchronously(Action action, CancellationToken token)\"}}"
【问题讨论】:
-
我认为您的
r标签有误。 -
您是否尝试过使用 List
而不是 [] 并在您的 api List 中使用 IEnumerable ? -
我发布了我的 JSON,请检查
-
从堆栈跟踪看来问题出在 Product 类的子类别字段或属性上。
标签: c# json serialization asp.net-web-api