0

我正在使用 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# 类具有decimal价格类型而不是默认类型double

public double Price { get; set;}

我尝试使用带有生成器设置JsonSerializerSettingsTransformationMethod属性的自定义静态方法,但没有任何改变。

4

2 回答 2

1

你可以试试这个

创造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);
    }

    ...
}

生成类,

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();
于 2020-08-20T07:01:09.273 回答
0

@tontonsevilla,您将如何返回 oneOfs 下的两个对象以包含在 C# POCO 中?在上面@user2966445 的示例中,它只会为我生成 oneOfs 下的第一个项目,我只会在 POCO 中获得具有名字、姓氏和运动属性的 POCO,而不包括车辆和价格。因此,当将 json 反序列化为 POCO 时,如果 json 有效负载包含车辆和价格,它就会爆炸。

我在 NJsonSchema.JsonSchema 对象“Resolve”方法中注意到的一件事,它还在内部调用“RemoveNullability”方法,并且此代码仅返回 oneOfs 中的第一项并且不知道如何解决它。

public JsonSchema RemoveNullability( JsonSchema schema ) 
{ 
    return schema.OneOf.FirstOrDefault( ( JsonSchema o ) => !o.IsNullable( SchemaType.JsonSchema ) ) ?? schema; 
}

于 2022-02-10T18:09:01.540 回答