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; 
}