【问题标题】:NJsonSchema C# - Change Generated Value TypeNJsonSchema C# - 更改生成的值类型
【发布时间】:2020-08-20 01:55:11
【问题描述】:

我正在使用 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 属性的自定义静态方法,但没有任何改变。

【问题讨论】:

  • 给它一个“十进制”的格式。
  • 不改变架构。

标签: c# njsonschema


【解决方案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();

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-10-25
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      相关资源
      最近更新 更多