簡體   English   中英

為什么我的JSON不序列化?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM