这就是我在 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"
}
]
}