![](/img/trans.png)
[英]asp.net core web api how to send json object from client side c#
[英]How can I send JSON response to client from ASP.NET Core Web API?
我是 .NET Core 的新手。 我正在創建一個 API,它返回一些數據作為響應。 我創建了一個實用函數successResponse
以向客戶端返回帶有數據的通用成功響應。
這是successResponse
的模型類
public class SuccessResponse
{
public object? payload { get; set; } = null;
public bool success { get; set; } = false;
public SuccessResponse(object data, bool isSuccess)
{
payload = data;
success = isSuccess;
}
}
我還創建了一個輔助類,它具有像這樣返回successResponse
的功能
public static class ResponseHandler
{
public static SuccessResponse successResponse(object data)
{
return new SuccessResponse(data, true);
}
public static ErrorResponse errorResponse(string error)
{
return new ErrorResponse(error);
}
}
在我的控制器中,我有這樣的代碼:
[HttpPost]
public async Task<IActionResult> GetIncomingFile(IFormFile file)
{
try
{
var options = new JsonSerializerOptions { IncludeFields = true };
List<ImportedFileData> importedExcelFileData = await ExcelMapperFileReader.getFileData(file);
BalanceSheet balanceSheetData = BalanceSheetReport.createBalanceSheet(importedExcelFileData);
return Ok(ResponseHandler.successResponse(JsonSerializer.Serialize(balanceSheetData, options)));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return BadRequest(ResponseHandler.errorResponse(ex.Message));
}
}
我的模型類BalanceSheet
是這樣的
public class BalanceSheet
{
public BalanceSheetAssets assets = null!;
public BalanceSheetLiabilities liabilities = null!;
public BalanceSheetEquity equity = null!;
public BalanceSheet(BalanceSheetAssets incomingAssets, BalanceSheetLiabilities incomingLiabilities, BalanceSheetEquity incomingEquity)
{
assets = incomingAssets;
liabilities = incomingLiabilities;
equity = incomingEquity;
}
}
問題是我在客戶端得到了這個響應:
{
"payload": "{\"assets\":{\"currentAssets\":[{\"title\":\"Inventory\",\"amount\":85300,\"code\":\"CA\"},{\"title\":\"Accounts Receivable\",\"amount\":4700,\"code\":\"CA\"},{\"title\":\"Cash\",\"amount\":5000,\"code\":\"CA\"}],\"nonCurrentAssets\":[{\"title\":\"Furniture\",\"amount\":200000,\"code\":\"NCA\"}],\"totalAssets\":255000},\"laibilities\":{\"currentLiabilities\":[{\"title\":\"Inventory\",\"amount\":85300,\"code\":\"CA\"},{\"title\":\"Accounts Receivable\",\"amount\":4700,\"code\":\"CA\"},{\"title\":\"Cash\",\"amount\":5000,\"code\":\"CA\"}],\"nonCurrentLiabilities\":[{\"title\":\"Furniture\",\"amount\":200000,\"code\":\"NCA\"}],\"totalLiabilities\":45000},\"equity\":{\"equityList\":[{\"title\":\"Equity\",\"amount\":150000,\"code\":\"EQ\"},{\"title\":\"Retained Earnings\",\"amount\":60000,\"code\":\"EQ\"}],\"totalEquity\":210000}}",
"success": true
}
但我想在客戶端接收格式正確的 JSON 響應。
我怎樣才能做到這一點?
您得到一個空對象,因為System.Text.Json
默認情況下會忽略此處記錄的字段。
BalanceSheet
類設計為具有公共字段,因此您會在響應中得到一個空對象。
你有幾個選擇:
JsonIncludeAttribute
添加到BalanceSheet
類的所有公共字段來指示System.Text.Json
包含字段。 有關更多詳細信息,請參見此處。BalanceSheet
類的設計並使用屬性而不是字段。在選項 1 中,您需要以這種方式更改代碼:
public class BalanceSheet
{
[JsonInclude]
public BalanceSheetAssets assets = null!;
[JsonInclude]
public BalanceSheetLiabilities laibilities = null!;
[JsonInclude]
public BalanceSheetEquity equity = null!;
public BalanceSheet(
BalanceSheetAssets incomingAssets,
BalanceSheetLiabilities incomingLaibilities,
BalanceSheetEquity incomingEquity) {
assets = incomingAssets;
laibilities = incomingLaibilities;
equity = incomingEquity;
}
}
在選項 2 中,您需要以這種方式更改代碼:
public class BalanceSheet
{
public BalanceSheetAssets Assets { get; } = null!;
public BalanceSheetLiabilities Laibilities { get; } = null!;
public BalanceSheetEquity Equity { get; } = null!;
public BalanceSheet(
BalanceSheetAssets incomingAssets,
BalanceSheetLiabilities incomingLaibilities,
BalanceSheetEquity incomingEquity) {
Assets = incomingAssets;
Laibilities = incomingLaibilities;
Equity = incomingEquity;
}
}
通常使用公共字段是一個糟糕的設計,所以我會選擇選項 2。有關更多詳細信息,請參見此處。
無論哪種方式,您都需要讓 ASP.NET Core 為您執行 JSON 序列化,因此以這種方式更改操作方法中的return
語句:
return Ok(ResponseHandler.succesResponse(balanceSheetData));
在我的評論中,我建議您將手動序列化為 JSON 作為調試步驟,以幫助我們了解您問題的性質。 你永遠不應該手動將響應對象序列化為 JSON:這是在執行OkObjectResult
時由 ASP.NET 核心框架自動為你完成的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.