diff --git a/openapi2/marsh.go b/openapi2/marsh.go index b15f3b82c..5aa162a72 100644 --- a/openapi2/marsh.go +++ b/openapi2/marsh.go @@ -17,10 +17,18 @@ func unmarshalError(jsonUnmarshalErr error) error { } func unmarshal(data []byte, v interface{}) error { + var jsonErr, yamlErr error + // See https://github.com/getkin/kin-openapi/issues/680 - if err := json.Unmarshal(data, v); err != nil { - // UnmarshalStrict(data, v) TODO: investigate how ymlv3 handles duplicate map keys - return yaml.Unmarshal(data, v) + if jsonErr = json.Unmarshal(data, v); jsonErr == nil { + return nil + } + + // UnmarshalStrict(data, v) TODO: investigate how ymlv3 handles duplicate map keys + if yamlErr = yaml.Unmarshal(data, v); yamlErr == nil { + return nil } - return nil + + // If both unmarshaling attempts fail, return a new error that includes both errors + return fmt.Errorf("failed to unmarshal data: json error: %v, yaml error: %v", jsonErr, yamlErr) } diff --git a/openapi3/marsh.go b/openapi3/marsh.go index 18036ae78..9be7bb44c 100644 --- a/openapi3/marsh.go +++ b/openapi3/marsh.go @@ -17,10 +17,18 @@ func unmarshalError(jsonUnmarshalErr error) error { } func unmarshal(data []byte, v interface{}) error { + var jsonErr, yamlErr error + // See https://github.com/getkin/kin-openapi/issues/680 - if err := json.Unmarshal(data, v); err != nil { - // UnmarshalStrict(data, v) TODO: investigate how ymlv3 handles duplicate map keys - return yaml.Unmarshal(data, v) + if jsonErr = json.Unmarshal(data, v); jsonErr == nil { + return nil + } + + // UnmarshalStrict(data, v) TODO: investigate how ymlv3 handles duplicate map keys + if yamlErr = yaml.Unmarshal(data, v); yamlErr == nil { + return nil } - return nil + + // If both unmarshaling attempts fail, return a new error that includes both errors + return fmt.Errorf("failed to unmarshal data: json error: %v, yaml error: %v", jsonErr, yamlErr) }