繁体   English   中英

如何为 class 生成 JSON 示例值,就像 Swagger 的示例响应一样?

[英]How to generate JSON example values for class, just like Swagger does for example response?

我将 Swagger 与我的 ASP.NET Core 应用程序一起使用,并用于 HTTP POST 端点返回Blog model:

[HttpPost]
[ProducesResponseType(typeof(Blog), StatusCodes.Status200OK)]
public IActionResult AddBlog([FromBody] string name)
{
    // Code removed for brevity...
    return Ok(newBlog);
}

博客:

public Blog
{
    public int Id { get; set; }

    public string Name { get; set; }
}

其 UI 中的 Swagger 将显示该端点的示例响应:

{
  "Id": 0,
  "Name": "string"
}

我想做的是在 JSON 中为我提供的 class 类型以及我需要它的地方生成这样的示例值,这是我应用程序中的其他地方,例如:

var json = exampleValuesGenerator.Generate(typeof(Blog));

这可能吗?

是的,可以为响应和 POST 请求生成此类示例值。 对于获取请求,这很困难,请在此处查看我的问题: SwashBuckle Swagger-UI Example Request for HTTP GET Method with FromQuery Attribute

看看 NuGet package Swashbuckle.AspNetCore.Filters

您可以定义一个示例响应,例如:

public class BlogExample : IExamplesProvider<Blog>
{
    public Blog GetExamples()
    {
        return new Blog()
        {
            Id = 123,
            Name = "John Smith"
        };
    }
}

然后 SwaggerUI 将显示这些值而不是空的默认值。

最接近我想要的生成器是使用库NJsonSchema 感谢@Helen 给了我关于 Json Schema 的宝贵指导。 下面的使用示例:

public string Generate(Type type)
{
    return JsonSchema
        .FromType(type)
        .ToSampleJson()
        .ToString();
}

虽然它并不完美。 例如,对于 model 定义如下:

public class User
{
    public string String { get; set; }
    public int Int { get; set; }
    public double Double { get; set; }
    public float Float { get; set; }
    public short Short { get; set; }
    public byte Byte { get; set; }
    public long Long { get; set; }
    public decimal Decimal { get; set; }
    public DateTime DateTime { get; set; }
    public TimeSpan TimeSpan { get; set; }
    public bool Bool { get; set; }
    public BindingFlags Enum2 { get; set; }
    public Blog NestedObject { get; set; }
    public Blog[] ArrayOfObjects { get; set; }
    public int[] ArrayOfValues { get; set; }
}

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
}

它生成一个样本 JSON:

{
  "String": "String",
  "Int": 0,
  "Double": 0,
  "Float": 0,
  "Short": 0,
  "Byte": 0,
  "Long": 0,
  "Decimal": 0,
  "DateTime": "2020-08-02T19:43:59.8759099+00:00",
  "TimeSpan": "TimeSpan",
  "Bool": false,
  "Enum2": 0,
  "NestedObject": null,
  "ArrayOfObjects": [
    {
      "Id": 0,
      "Name": "Name"
    }
  ],
  "ArrayOfValues": [
    0
  ]
}

可悲的是, NestedObject属性是null ,而浮点类型应该具有示例值,表明它们确实是浮点类型,而不仅仅是0 ,表明它们是 integer 类型。 所以,是的,它可以改进。 但这绝对比没有好!

NJsonSchema可以很好地为CLR类型生成示例 json:

var sampleJson = JsonSchema.FromType(typeof(Foo)).ToSampleJson().ToString();

悬停,如果Foo具有嵌套的复杂类型作为属性,则必须添加其他属性,例如[Required]才能使事情正常进行。

因此,我更喜欢将AutoFixtureNJsonSchema结合起来生成示例 json,示例如下:

[Fact]
public void Test1()
{
  var sampleJson = JsonConvert.SerializeObject(new Fixture().Create<Foo>());
  var str = JsonSchema.FromSampleJson(sampleJson).ToSampleJson();
  File.WriteAllText(Path.Combine(Path.GetTempPath(),Path.GetTempFileName()),str.ToString());
}

您可以使用任何 JSON 库并序列化一个空的 object。

使用newtonsoft JSON

var json = JsonConvert.SerializeObject(new Blog());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM