NJsonSchema C# - 更改生成的值类型
NJsonSchema C# - Change Generated Value Type
我正在使用 NJsonSchema CsharpGenerator 10.1.24 并使用以下架构生成 POCO:
"description": "schema validating people and vehicles",
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"required": [ "oneOf" ],
"properties": { "oneOf": [
{
"firstName": {"type": "string"},
"lastName": {"type": "string"},
"sport": {"type": "string"}
},
{
"vehicle": {"type": "string"},
"price":{"type": "number"}
}
]
}
}
如何让生成的 C# class 具有 decimal
类型的价格而不是默认的 double
?
public double Price { get; set;}
我尝试使用带有生成器设置的自定义静态方法 JsonSerializerSettingsTransformationMethod
属性 但没有任何改变。
你可以试试这个,
创建CustomTypeResolver
public class CustomTypeResolver : CSharpTypeResolver
{
...
public override string Resolve(JsonSchema schema, bool isNullable, string typeNameHint)
{
if (schema == null)
{
throw new ArgumentNullException(nameof(schema));
}
schema = GetResolvableSchema(schema);
if (schema == ExceptionSchema)
{
return "System.Exception";
}
var type = schema.ActualTypeSchema.Type;
if (type.HasFlag(JsonObjectType.Number))
{
return isNullable ? "decimal?" : "decimal"; ;
}
return base.Resolve(schema, isNullable, typeNameHint);
}
...
}
生成 class,
var jsonSchema = File.ReadAllText("json1.json");
var schema = JsonSchema.FromJsonAsync(jsonSchema).GetAwaiter().GetResult();
var settings = new CSharpGeneratorSettings();
var typeResolver = new CustomTypeResolver(settings);
var generator = new CSharpGenerator(schema, settings, typeResolver);
var code = generator.GenerateFile();
@tontonsevilla,您如何 return oneOfs 下的两个对象都包含在 C# POCO 中?在上面的示例中,@user2966445 只会为我生成 oneOfs 下的第一个项目,我只会在 POCO 中获得具有 firstName、lastName 和 sport 属性的 POCO,不包括车辆和价格。因此,当将 json 反序列化为 POCO 时,如果 json 有效载荷包含车辆和价格,它就会爆炸。
我在 NJsonSchema.JsonSchema 对象的“Resolve”方法中注意到的一件事,它还在内部调用了“RemoveNullability”方法,而这段代码仅 returns 在 oneOfs 中的第一项并且不确定如何绕过它。
public JsonSchema RemoveNullability( JsonSchema schema )
{
return schema.OneOf.FirstOrDefault( ( JsonSchema o ) => !o.IsNullable( SchemaType.JsonSchema ) ) ?? schema;
}
我正在使用 NJsonSchema CsharpGenerator 10.1.24 并使用以下架构生成 POCO:
"description": "schema validating people and vehicles",
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"required": [ "oneOf" ],
"properties": { "oneOf": [
{
"firstName": {"type": "string"},
"lastName": {"type": "string"},
"sport": {"type": "string"}
},
{
"vehicle": {"type": "string"},
"price":{"type": "number"}
}
]
}
}
如何让生成的 C# class 具有 decimal
类型的价格而不是默认的 double
?
public double Price { get; set;}
我尝试使用带有生成器设置的自定义静态方法 JsonSerializerSettingsTransformationMethod
属性 但没有任何改变。
你可以试试这个,
创建CustomTypeResolver
public class CustomTypeResolver : CSharpTypeResolver
{
...
public override string Resolve(JsonSchema schema, bool isNullable, string typeNameHint)
{
if (schema == null)
{
throw new ArgumentNullException(nameof(schema));
}
schema = GetResolvableSchema(schema);
if (schema == ExceptionSchema)
{
return "System.Exception";
}
var type = schema.ActualTypeSchema.Type;
if (type.HasFlag(JsonObjectType.Number))
{
return isNullable ? "decimal?" : "decimal"; ;
}
return base.Resolve(schema, isNullable, typeNameHint);
}
...
}
生成 class,
var jsonSchema = File.ReadAllText("json1.json");
var schema = JsonSchema.FromJsonAsync(jsonSchema).GetAwaiter().GetResult();
var settings = new CSharpGeneratorSettings();
var typeResolver = new CustomTypeResolver(settings);
var generator = new CSharpGenerator(schema, settings, typeResolver);
var code = generator.GenerateFile();
@tontonsevilla,您如何 return oneOfs 下的两个对象都包含在 C# POCO 中?在上面的示例中,@user2966445 只会为我生成 oneOfs 下的第一个项目,我只会在 POCO 中获得具有 firstName、lastName 和 sport 属性的 POCO,不包括车辆和价格。因此,当将 json 反序列化为 POCO 时,如果 json 有效载荷包含车辆和价格,它就会爆炸。
我在 NJsonSchema.JsonSchema 对象的“Resolve”方法中注意到的一件事,它还在内部调用了“RemoveNullability”方法,而这段代码仅 returns 在 oneOfs 中的第一项并且不确定如何绕过它。
public JsonSchema RemoveNullability( JsonSchema schema )
{
return schema.OneOf.FirstOrDefault( ( JsonSchema o ) => !o.IsNullable( SchemaType.JsonSchema ) ) ?? schema;
}