![](/img/trans.png)
[英]Why won't my $.ajax call return a json object from a cshtml file?
[英]Why won't my JSON serialise?
在Web API控制器中,我返回一個JSON編碼的對象,實際上是一個Organization
對象的列表,每個對象都有自己的Branch
對象集合,每個對象又都有一個Person
對象列表。
我從控制器以IHttpActionResult
返回它:
return Ok(SerializeObject(orgs));
哪里:
protected virtual string SerializeObject(object source)
{
return JsonConvert.SerializeObject(source, SharedSettings.JsonSerializerSettings);
}
和
public static JsonSerializerSettings JsonSerializerSettings { get; } = new JsonSerializerSettings
{
Formatting = Formatting.Indented,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
StringEscapeHandling = StringEscapeHandling.EscapeNonAscii,
TypeNameHandling = TypeNameHandling.None,
NullValueHandling = NullValueHandling.Include
};
我要求它像:
HttpResponseMessage response = await Client.PostAsync(resource, null);
if (!response.IsSuccessStatusCode)
{
RaiseException(response, exMsg);
}
var content = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<TReturn>(content, SharedSettings.JsonSerializerSettings);
我不使用response.Content.ReadAsAsync<TReturn>()
因為我真的想確定自己在兩側使用了相同的Json序列化程序及其設置。 如果您為了簡潔起見,請使用幾行代碼,返回的JSON看起來不錯:
[
{
"Branches": [
{
"People": [
{
"FullName": "Katie Darwin",
"BranchId": 2,
"OrgId": 2,
"Id": 18
}
],
"Name": "Jolimont",
"Phone": null,
"OrgId": 2,
"Id": 2
}
],
"Name": "Contoso, Ltd.",
"Id": 2
},
{
"Branches": [],
"Name": "Trey Research",
"Id": 11
}
]
我反序列化的例外是
'將值“”“轉換為類型'System.Collections.Generic.List`1 [ApptEase.DataModels.Entities.Organization]'時出錯。路徑”,第1行,位置439200。
以前我從未遇到過使用NewtonSoft JSON遇到任何此類麻煩的情況,但也許我對此的需求減少了。 有人知道什么地方可能出問題嗎?
BREAKING:如果我將該JSON字符串寫入文件,然后使用小型測試程序讀取它,則可以很好地反序列化,沒有任何顯式選項。 滿懷希望的是,我從主程序中的反序列化中刪除了options子句,但仍然遇到相同的錯誤。 我想我應該開始研究文本編碼問題。
還可能需要注意, Content-Length
標頭和錯誤位置相等:439200。
我很愚蠢,很愚蠢,以至於我被這么多變化無常的例子誤導了。 我已經忘記了ApiController
的宗旨之一是它的行為更像是一個存儲庫,而不是一個控制器,沒有HTTP廢話。 現在有問題的控制器如下所示:
[System.Web.Mvc.RoutePrefix("api/Org")]
public class OrgController : BaseController
{
[HttpPost]
public IEnumerable<Organization> Get()
{
Db.Configuration.LazyLoadingEnabled = false;
return Db.Organizations.ToList();
}
}
這樣返回的對象就可以通過Content.ReadAsAsync<TReturn>()
。
public virtual async Task<TReturn> PostAsync<TReturn>(string resource)
{
var exMsg = $"Post request failed to get resource: '{resource}' from '{Client.BaseAddress}'.";
try
{
HttpResponseMessage response = await Client.PostAsync(resource, null);
if (!response.IsSuccessStatusCode)
{
RaiseException(response, exMsg);
}
return await response.Content.ReadAsAsync<TReturn>();
}
catch (Exception ex) when (ex.GetType() != typeof(RestClientException))
{
throw;
}
}
我可能應該使用自定義的Response
對象,該對象可以為調用者提供更多信息,例如捕獲到的異常,但是像這樣的原始方法是它被設計為如何工作以及如此地工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.