【问题标题】:Append Schema to Json data returned from controller将 Schema 附加到从控制器返回的 Json 数据中
【发布时间】:2018-03-01 16:18:01
【问题描述】:

我正在尝试将架构添加到从每个控制器及其内部的每个端点返回的 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 中,但我无法获取我在响应中发送的类型的属性。有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: c# json rest api jsonschema


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2011-01-20
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-21
      相关资源
      最近更新 更多