2017-11-23 16 views
1

次のように私は、スキーマを使用している場合:存在しないプロパティを強制的にnullにするにはどうすればよいですか?

{ 
    "id": "http://example.com/my_application", 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "title": "my_application_schema", 
    "additionalProperties": false, 
    "definitions": { 
    "NumberField": { 
     "type": "number", 
     "min": 0, 
     "max": 2147483647 
    }, 
    "StringField": { 
     "type": "string", 
     "minLength": 1, 
     "maxLength": 12 
    }, 
    "MainObject": { 
     "type": "object", 
     "additionalProperties": false, 
     "properties": { 
     "object1": { 
      "$ref": "#/definitions/Object1" 
     }, 
     "object2": { 
      "$ref": "#/definitions/Object2" 
     } 
     }, 
     "minProperties": 1, 
     "maxProperties": 1 
    }, 
    "Object1": { 
     "type": "object", 
     "additionalProperties": false, 
     "properties": { 
     "field1": { 
      "$ref": "#/definitions/NumberField", 
      "proto_field": 1 
     } 
     }, 
     "required": [ 
     "field1" 
     ] 
    }, 
    "Object2": { 
     "type": "object", 
     "additionalProperties": false, 
     "properties": { 
     "field1": { 
      "$ref": "#/definitions/StringField", 
      "proto_field": 1 
     } 
     }, 
     "required": [ 
     "field1" 
     ] 
    } 
    }, 
    "type": "object", 
    "properties": { 
    "Content": { 
     "$ref": "#/definitions/MainObject" 
    } 
    } 
} 

そして、私はC#クラスのセットを生成するために、次のコードを使用しています:

NJsonSchema.JsonSchema4 schema = await NJsonSchema.JsonSchema4.FromFileAsync(<path to schema>); 
var generator = new CSharpGenerator(schema); 
var file = generator.GenerateFile(); 

そして、結果としてクラスを使用して、この操作を実行します:

My_application_schema o = JsonConvert.DeserializeObject<My_application_schema>(@" 
      { 
'Content': { 
'object1': { 
'field1': 20 
} 
} 
}"); 

そしてデシリアライズがエラーなしで完了するが、 O得られたオブジェクトは、オブジェクト1オブジェクト2のいずれも、オブジェクト2のメンバーはすべてnullです。私は必要なもの

JsonSerializerSettings settings = new JsonSerializerSettings() 
{ 
    NullValueHandling = NullValueHandling.Ignore 
}; 
String s = Newtonsoft.Json.JsonConvert.SerializeObject(o, settings); 
// {"Content":{"object1":{"field1":20.0},"object2":{}}} 

は非直列化されたオブジェクトに存在する、またはnullに設定されていないのいずれかにobject2はためです。スキーマ自体、またはこのパイプラインに関連するさまざまなプロセスのいずれかでこれを行う方法はありますか?

答えて

3

はそれがあなたのオブジェクト2がnull、またはあなたが探しているタイプのいずれかであるので、必要なスキーマの変更のようなものになることを意味しないだろうgithub page会社のオブジェクトを表示する場所

+0

私が必要としていたものです。 –

2

私はC#は分かりませんが、ちょっとばかげた答えです。

GSON(Java)は、不足しているプロパティをnullとして扱います.NJsonSchemaは、不足しているプロパティをそのタイプのデフォルト値として扱います。

それは、不要な初期値は、次のような行で、テンプレートによって生成されているように見えます:https://github.com/RSuter/NJsonSchema/blob/1a50dfa4d5d562ae89e7aac49c1573ad4e32313a/src/NJsonSchema.CodeGeneration.CSharp/Templates/Class.liquid#L16

これが本当であることHasDefaultValue上の条件付きです。これは、https://github.com/RSuter/NJsonSchema/blob/1a50dfa4d5d562ae89e7aac49c1573ad4e32313a/src/NJsonSchema.CodeGeneration/Models/PropertyModelBase.cs#L40

https://github.com/RSuter/NJsonSchema/blob/1a50dfa4d5d562ae89e7aac49c1573ad4e32313a/src/NJsonSchema.CodeGeneration/Models/PropertyModelBase.cs#L50註釈_settings.GenerateDefaultValuesに設定されています。おそらく_settings.GenerateDefaultValuesをfalseに設定することはできますか?

https://groups.google.com/forum/#!topic/jsonschema/mD6GDca4zN8から、JSONスキーマはnull値を持つように見えます。おそらくこれは、スキーマにテキストを追加する代償として、それを修正するだろうか?

"properties": { 
    "object1": { 
    "oneOf": [ 
     { 
     "$ref": "#/definitions/Object1" 
     }, 
     { 
     "type": "null" 
     } 
    ] 
    }, 
    "object2": { 
    "oneOf": [ 
     { 
     "$ref": "#/definitions/Object2" 
     }, 
     { 
     "type": "null" 
     } 
    ] 
    } 
} 

同様の例は、上で見つけることができます:

関連する問題