簡體   English   中英

將模式附加到從控制器返回的Json數據

[英]Append Schema to Json data returned from controller

我試圖將架構添加到從每個控制器及其內部的每個端點返回的JSON。

假設我有一個端點“ localhost / values / get”,並且它返回如下的JSON。

{
    Filed1:'Field1Value',
    Field2:'Field2Value',
    Field3:3
}

我想將其轉換為如下

{
    Schema:[{
        Field:'Filed1',
        DataType:'String'
    },
    {
        Field:'Field2',
        dataType:'String'
    },
    {
        Field:'Field3',
        DataType:'int'
    }],
    Data:{
        Filed1:'Field1Value',
        Field2:'Field2Value',
        Field3:3
    }
}

有沒有一種方法可以在一個位置為每個返回對象添加此對象,而不是為每個控制器都添加呢?

像屬性一樣。

我已經嘗試使用WriteResponseBodyAsync

Options.OutputFormatters.Insert(0, new OutputFormatter());

startup.cs中 ,但是我無法獲取響應中發送的類型的屬性。 有人可以幫我嗎

這就是我在Web API中實現輸出格式的方式。

我的Startup.cs如下所示。 在ConfigureServices內部

services.AddMvc(Options =>
{
    Options.OutputFormatters.Insert(0, new OutputFormatter());
});

如下創建一個OutputFormatter.cs類。

public OutputFormatter()
{
    SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/json"));
    SupportedEncodings.Add(Encoding.GetEncoding("iso-8859-1"));
}

public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
{
    var response = context.HttpContext.Response;
    var responseData = Encoding.UTF8.GetBytes(LoadSchema(context));
    return response.Body.WriteAsync(responseData, 0, responseData.Length);
}

private string LoadSchema(OutputFormatterWriteContext context)
{
    var schema = new List<SchemaModel>();
    var returnData = new ReturnModel();
    foreach (var Field in (context.Object as IEnumerable<dynamic>).FirstOrDefault().GetType().GetProperties())
    {
        schema.Add(new SchemaModel
        {
            FieldName = Field.Name,
            DataType = Field.PropertyType.Name
        });
    }
    returnData.Schema = schema;
    returnData.ReturnData = context.Object;
    return JsonConvert.SerializeObject(returnData);
}

您可以通過更改上述代碼中的邏輯來更改生成模式的方式。 照原樣編寫所有控制器,然后返回模型,此OutputFormatter將負責將架構添加到JSON。

JSON數據如下所示。

{
    "Schema": [
        {
            "FieldName": "FirstProp",
            "DataType": "String"
        },
        {
            "FieldName": "SecondProp",
            "DataType": "Int32"
        },
        {
            "FieldName": "ThirdProp",
            "DataType": "Decimal"
        },
        {
            "FieldName": "FourthProp",
            "DataType": "Boolean"
        },
        {
            "FieldName": "FifithProp",
            "DataType": "DateTime"
        }
    ],
    "ReturnData": [
        {
            "FirstProp": "value0",
            "SecondProp": 0,
            "ThirdProp": -0.9,
            "FourthProp": true,
            "FifithProp": "2018-03-06T15:26:08.8428651-06:00"
        },
        {
            "FirstProp": "value1",
            "SecondProp": 1,
            "ThirdProp": 0.1,
            "FourthProp": false,
            "FifithProp": "2018-03-07T15:26:08.8428702-06:00"
        },
        {
            "FirstProp": "value2",
            "SecondProp": 2,
            "ThirdProp": 1.1,
            "FourthProp": true,
            "FifithProp": "2018-03-08T15:26:08.8428713-06:00"
        },
        {
            "FirstProp": "value3",
            "SecondProp": 3,
            "ThirdProp": 2.1,
            "FourthProp": false,
            "FifithProp": "2018-03-09T15:26:08.8428724-06:00"
        },
        {
            "FirstProp": "value4",
            "SecondProp": 4,
            "ThirdProp": 3.1,
            "FourthProp": true,
            "FifithProp": "2018-03-10T15:26:08.8428735-06:00"
        }
    ]
}

暫無
暫無

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

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