将Schema附加到从控制器返回的Json数据

时间:2018-03-01 16:18:01

标签: c# json rest api jsonschema

我正在尝试将模式添加到从每个控制器及其中的每个端点返回的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 中的

,但我无法获取我在响应中发送的类型的属性。有人可以帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

这就是我在Web API中实现输出格式的方法。

My 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"
        }
    ]
}