我目前正在寻找从大型OpenAPI规范中提取所有JSON模式的方法.我一直在使用以下NuGet软件包:
Microsoft.OpenApi v1.3.1
Microsoft.OpenApi.Readers v1.3.1
我希望用这些来解析一个大型开放API规范,并提取所有JSON模式,我可以将其解析为"Microsoft".OpenApi.模型.OpenApiSchema的对象.但我似乎无法从这些对象创建JSON模式并将其写入文件.
目前,我有以下几点:
using (FileStream fs = File.Open(file.FullName, FileMode.Open))
{
var openApiDocument = new OpenApiStreamReader().Read(fs, out var diagnostic);
foreach (var schema in openApiDocument.Components.Schemas)
{
var schemaName = schema.Key;
var schemaContent = schema.Value;
var outputDir = Path.Combine(outputDirectory.FullName, fileNameWithoutExtension);
if (!Directory.Exists(outputDir))
{
Directory.CreateDirectory(outputDir);
}
var outputPath = Path.Combine(outputDir, schemaName + "-Schema.json");
var outputString = schemaContent.Serialize(OpenApiSpecVersion.OpenApi3_0, OpenApiFormat.Json);
using (TextWriter sw = new StreamWriter(outputPath, true))
{
sw.Write(outputString);
sw.Close();
}
}
}
schemaContent
似乎具有模式的所有相关属性,但我似乎无法确定将其从该对象转换为JSON模式的下一步.我肯定我错过了一些简单的东西,因此任何洞察都将不胜感激.
UPDATED
我有一点 idea ,并采用了稍微不同的方法,使用NewtonSoft Json.
var OpenApitext = File.ReadAllText(file.FullName, Encoding.UTF8);
var settings = new JsonSerializerSettings
{
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
MetadataPropertyHandling = MetadataPropertyHandling.Ignore, //ign
Formatting = Newtonsoft.Json.Formatting.Indented
};
dynamic openApiJson = JsonConvert.DeserializeObject<ExpandoObject>(OpenApitext, settings);
if (openApiJson?.components?.schemas != null)
{
foreach (var schema in openApiJson.components.schemas)
{
var schemaString = JsonConvert.SerializeObject(schema, settings);
var outputDir = Path.Combine(outputDirectory.FullName, fileNameWithoutExtension);
if (!Directory.Exists(outputDir))
{
Directory.CreateDirectory(outputDir);
}
var outputPath = Path.Combine(outputDir, schema.Name + "-Schema.json");
using (TextWriter sw = new StreamWriter(outputPath, true))
{
sw.Write(schemaString);
sw.Close();
}
}
}
现在,这将允许我创建JSON模式并将其写入文件,但它不想解析引用.查看API规范,所有引用似乎都是API规范的本地引用.在循环模式并将其写入文件之前,我需要做什么来解析开放API规范中的所有引用?我做了一些研究,有几个人似乎自己构建了这个功能,但他们总是使用类对象作为支持它的方式,这是我在这里做不到的.