我正在使用 NJsonSchema 包来生成一些需要由不同客户端使用的类的模式,但由于某种原因,将所有模式合并到一个完整的模式中并没有按预期工作。下面是为所有类型创建一个单一模式的方法:
public static JsonSchema GetGameLogicModelSchema()
{
var listOfTypes = new List<Type>();
listOfTypes.AddRange(Assembly.GetAssembly(typeof(FixtureParameters)).GetTypes().Where(x => x.IsSubclassOf(typeof(FixtureParameters))));
listOfTypes.AddRange(Assembly.GetAssembly(typeof(ScoreInformation)).GetTypes().Where(x => x.IsSubclassOf(typeof(ScoreInformation))));
listOfTypes.AddRange(Assembly.GetAssembly(typeof(StatusInformation<,>)).GetTypes().Where(x => x.IsSubclassOf(typeof(StatusInformation<,>))));
var schema = new JsonSchema
{
AllowAdditionalItems = true,
AllowAdditionalProperties = true
};
var children = listOfTypes.Select(t => JsonSchema.FromType(t, new JsonSchemaGeneratorSettings
{
FlattenInheritanceHierarchy = true,
SerializerSettings = new JsonSerializerSettings
{
Converters =
{
new StringEnumConverter()
}
}
}));
foreach (var jsonSchema in children)
{
schema.Items.Add(jsonSchema);
}
return schema;
}
我只是使用方法将该模式转换为 JSON ToJson
。根据我的理解,架构本身看起来不错,有所有定义等。但是当我将它复制粘贴到这里时,它给了我一个包含所有类的所有属性的类,它只是一个带有字段和属性的大类,并不多像我的代码中的类。
也尝试从 VS 做如下所述:
var text = File.ReadAllTextAsync("Files/Data.json").Result;
var schemaFromFile = JsonSchema.FromSampleJson(text);
var path = Path.GetFullPath("GameLogic");
var classGenerator = new CSharpGenerator(schemaFromFile, new CSharpGeneratorSettings
{
Namespace = "GameLogic",
SchemaType = SchemaType.JsonSchema,
ClassStyle = CSharpClassStyle.Poco
});
var codeFile = classGenerator.GenerateFile();
这会给我很多类的名字,比如Anonymous
,Anonymous32
等等。一些奇怪的名字。
我的方法有问题还是问题出在客户端?
编辑:我不得不更改客户端的方法JsonSchema.FromSampleJson(text)
并JsonSchema.FromFileAsync(path).Result
改为使用,但现在我得到一个空结果:
var path = Path.GetFullPath("Files/Data.json");
var schemaFromFile = JsonSchema.FromFileAsync(path).Result;
var classGenerator = new CSharpGenerator(schemaFromFile, new CSharpGeneratorSettings
{
Namespace = "GameLogic",
ClassStyle = CSharpClassStyle.Poco
});
var codeFile = classGenerator.GenerateFile();
using (var sw = File.CreateText("Generated.cs"))
{
sw.Write(codeFile);
}
根本没有生成类...