CamelCase属性名称与NJsonSchema C#代码生成



有人知道在代码生成过程中配置NJsonSchema以使用CamelCase属性命名的方法吗?我有一个JSON架构,它的属性名称像message_id,这导致了C#属性名称"Message_id",即"MessageId"可能是一种更像C#的方式。

对于像"[JsonProperty("message_id"("这样的属性,指定不同名称之间的连接是没有问题的。

所以,您询问了有关代码生成的问题。我遇到了问题,它生成的模式与发送到我的Angular应用程序的内容不匹配。所以,虽然这并不是你想要的,但也许它能帮助你找到答案(也许?(。

为了生成具有camel-case属性名称的架构,我将Default property Name Handling设置为CamelCase,但这是使用不推荐使用的调用来直接设置这些设置。应该有一些方法可以直接使用SerializerSettings,但我没能做到这一点。这不是我的生产代码,所以它可以。

internal class SchemaFileBuilder<T>
{
public static void CreateSchemaFile()
{
CreateSchemaFile(typeof(T).Name);
}
public static void CreateSchemaFile(string fileName)
{
JsonSchemaGeneratorSettings settings = new JsonSchemaGeneratorSettings();
settings.DefaultPropertyNameHandling = PropertyNameHandling.CamelCase;
var schema = NJsonSchema.JsonSchema.FromType<T>(settings);
var json = schema.ToJson();
Directory.CreateDirectory("Schemas");
File.WriteAllText($"Schemas\{fileName}.schema.json", json);
}
}

我将其设置为一个通用函数,这样我就可以将多个模式传递给任一createSchemaFile函数。下面是一些示例调用,它们将生成一个Person.schema.json文件和一个Persons.schema.json:

SchemaFileBuilder<Person>.CreateSchemaFile();
SchemaFileBuilder<Dictionary<string, Person>>.CreateSchemaFile("Persons");

正如Mike Sage上面提到的,不赞成使用DefaultPropertyNameHandling。过时的消息建议直接使用SerializerSettings;以下解决方案适用于我的情况。

var contractResolver = new DefaultContractResolver 
{
NamingStrategy = new CamelCaseNamingStrategy()
};
var jsonSettings = new JsonSchemaGeneratorSettings 
{
SerializerSettings = new JsonSerializerSettings 
{
ContractResolver = contractResolver
}
};
var schema = JsonSchema.FromType(type, jsonSettings);
// Then, use the schema as required. For instance:
var schemaJson = schema.ToJson();

最新更新