这个问题与Swagger无关,纯粹是序列化问题。
你有三种解决方案:
1.编写自己定制的向量JSON。(只是概念)
2.使用带基本类型的自定义对象并映射它。(只是概念)
3.使用Newtonsoft.Json (建议的解决方案)
关于Microsoft
doc,可以在比较列表中看到
System.Text.Json
,它可能有一些限制。
如果您想要建议的解决方案,请直接跳转到解决方案3。
让我们来看看自定义
serialized的第一个概念。顺便说一句,这个自定义示例只是为了演示,不是完整的解决方案。
所以你可以做以下事情:
- 创建一个自定义向量
CustomVector
模型。
- 创建一个自定义的
VectorConverter
类,继承自 JsonConverter
。
- 添加一些映射。
- 将属性
VectorConverter
放到向量属性中。
这是我的 CustomVector 尝试:
public class CustomVector
{
public float? X { get; set; }
public float? Y { get; set; }
public float? Z { get; set; }
}
并自定义VectorConverter:
public class VectorConverter : JsonConverter<Vector3>
{
public override Vector3 Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return new Vector3();
}
public override void Write(Utf8JsonWriter writer, Vector3 data, JsonSerializerOptions options)
{
var customVector = new CustomVector
{
X = data.X,
Y = data.Y,
Z = data.Z
};
var result = JsonSerializer.Serialize(customVector);
writer.WriteStringValue(result);
}
}
并且您的矢量属性,添加了以下属性:
[JsonConverter(typeof(VectorConverter))]
public Vector3 Vector { get
这将返回以下结果:
![enter image description here](https://istack.dev59.com/0nwkg.webp)
现在这解决了部分问题,如果您想发布矢量对象,您将面临另一个挑战,这也取决于您的实现逻辑。
因此,我尝试了第二个解决方案,在这里我们公开了我们的自定义向量并忽略了json中的vector3,并将其映射到/从我们的代码中的Vector3:
因此,我们引入了一个CustomVector,我们可以在模型中使用它代替Vector3,然后将其映射到我们的Vector3。
public class Test
{
public string Field { get; set; }
public string Property { get; set; }
[JsonIgnore]
public Vector3 Vector { get; set; }
public CustomVector CustomVector { get; set; }
}
![enter image description here](https://istack.dev59.com/YbGG8.webp)
这是一个带有映射的GET和POST方法示例:
[HttpGet]
public Test Get()
{
var vector = new CustomVector() { X = 1, Y = 1, Z = 1 };
var test = new Test
{
Field = "Field",
Property = "Property",
CustomVector = vector
};
VectorMapping(test);
return test;
}
[HttpPost]
public Test Post(Test test)
{
VectorMapping(test);
return test;
}
private static void VectorMapping(Test test)
{
test.Vector = new Vector3
{
X = test.CustomVector.X.GetValueOrDefault(),
Y = test.CustomVector.Y.GetValueOrDefault(),
Z = test.CustomVector.Z.GetValueOrDefault()
};
}
第一种解决方案的缺点是需要编写完整自定义序列化,而在第二种解决方案中,我们引入了额外的模型和映射。
建议的解决方案是,进行第三次尝试:
保留您的现有解决方案不变,只需向您的项目添加NuGet
Swashbuckle.AspNetCore.Newtonsoft
,例如:
<PackageReference Include="Swashbuckle.AspNetCore.Newtonsoft" Version="5.6.3" />
而在你的创业公司中
services.AddSwaggerGenNewtonsoftSupport()
启动,这将生成文档,因为它允许序列化和反序列化Vector3和其他不受System.Text.Json支持的类类型。
正如您所看到的,现在文档中包括了Vector3:
![enter image description here](https://istack.dev59.com/K4X3C.webp)
我相信还有其他方法可以实现这个,所以这是我尝试解决它的方式。