簡體   English   中英

如何使用 asp.net core 在 JSON web api 請求中捕獲包含的屬性名稱?

[英]How can I capture included property names in a JSON web api request with asp.net core?

我正在構建一個 asp.net 核心 web api,我需要跟蹤實際包含在 JSON 主體中的屬性,因為 .NET 沒有 javascript 中的 undefined 概念,只是 null。

我創建了一個接口,我的所有模型都實現了它,它只是一個名為 IncludedProperties 的字符串數組:

string[] IncludedProperties {get; set;}

我可能有模型,其中嵌套了更多這些模型。 每當我反序列化這些模型之一時,我都希望它填充這個 IncludedProperties 列表。

例如,在我的控制器中:

public async Task<ActionResult> PatchModel([FromRoute]Guid id, [FromBody] RootModel model) { ... }

類被定義為:

public class RootModel : IIncludedProperties
{
    public string Name { get; set;}
    public string Description {get; set;}
    public NestedModel SubEntity { get; set;}
    public string[] IncludedProperties {get; set;}
}

public class NestedModel : IIncludedProperties
{
   public string Name {get; set;}
   public decimal Value {get; set;}
   public string[] IncludedProperties {get; set;}
}

如果 JSON 正文如下:

{
    "Name": "New Entity 01",
    "SubEntity": {
        "Name": "Child Entity 01",
        "Value": 0.5
    }
}

根的包含屬性為[ "Name", "SubEntity"] ,嵌套模型的包含屬性為[ "Name", "Value" ]

我正在閱讀微軟關於JSON 自定義轉換器的文檔,但似乎我需要重寫整個 json 轉換器來添加一些額外的功能。 有什么方法可以“插入”到現有的轉換器,只是為了捕獲包含的屬性名稱?

這可以通過反射和遞歸來解決。 如果你不介意在每個控制器內多加一行,你可以在模型綁定后調用這個函數:

void PopulateIncludedProperties(IIncludedProperties obj)
{
    var properties = obj.GetType().GetProperties().ToList();
    obj.IncludedProperties = properties
        .Where(p => p.Name != "IncludedProperties" && p.GetValue(obj) != null)
        .Select(p => p.Name).ToArray();

    foreach (var prop in properties)
    {
        var value = prop.GetValue(obj);
        if (value is IIncludedProperties includedPropValue)
        {
            PopulateIncludedProperties(includedPropValue);
        }
    }
}

如果要填充IEnumerable<IIncludedProperties>IncludedProperties ,請IEnumerable<IIncludedProperties>自定義

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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