簡體   English   中英

如何從 ASP.NET Core Web API 向客戶端發送 JSON 響應?

[英]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類設計為具有公共字段,因此您會在響應中得到一個空對象。

你有幾個選擇:

  1. 您可以通過將JsonIncludeAttribute添加到BalanceSheet類的所有公共字段來指示System.Text.Json包含字段。 有關更多詳細信息,請參見此處
  2. 您可以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.

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