@@ -404,12 +404,42 @@ func (schema Schema) MarshalYAML() (any, error) {
404404
405405// UnmarshalJSON sets Schema to a copy of data.
406406func (schema * Schema ) UnmarshalJSON (data []byte ) error {
407- type SchemaBis Schema
407+ type Alias Schema
408+ type SchemaBis struct {
409+ Alias
410+ Discriminator json.RawMessage `json:"discriminator,omitempty" yaml:"discriminator,omitempty"`
411+ }
412+
408413 var x SchemaBis
409414 if err := json .Unmarshal (data , & x ); err != nil {
410415 return unmarshalError (err )
411416 }
412- _ = json .Unmarshal (data , & x .Extensions )
417+
418+ type DiscriminatorObject struct {
419+ Discriminator * Discriminator `json:"discriminator,omitempty" yaml:"discriminator,omitempty"`
420+ }
421+
422+ if len (x .Discriminator ) > 0 {
423+ var ds * string
424+ if err := json .Unmarshal (x .Discriminator , & ds ); err == nil {
425+ // In OpenAPI 2, the Discriminator is a string field, while in OpenAPI 3,
426+ // it corresponds to the Discriminator.PropertyName field.
427+ // If the OpenAPI 2 Discriminator (ds) is not nil, we assign it to
428+ // the OpenAPI 3 equivalent, which is Discriminator.PropertyName.
429+ if ds != nil {
430+ x .Alias .Discriminator = & Discriminator {
431+ PropertyName : * ds ,
432+ }
433+ }
434+ } else {
435+ var do DiscriminatorObject
436+ if err := json .Unmarshal (x .Discriminator , & do .Discriminator ); err == nil && do .Discriminator != nil {
437+ x .Alias .Discriminator = do .Discriminator
438+ }
439+ }
440+ }
441+
442+ _ = json .Unmarshal (data , & x .Alias .Extensions )
413443
414444 delete (x .Extensions , "oneOf" )
415445 delete (x .Extensions , "anyOf" )
@@ -464,7 +494,7 @@ func (schema *Schema) UnmarshalJSON(data []byte) error {
464494 x .Extensions = nil
465495 }
466496
467- * schema = Schema (x )
497+ * schema = Schema (x . Alias )
468498
469499 if schema .Format == "date" {
470500 // This is a fix for: https://github.com/getkin/kin-openapi/issues/697
0 commit comments