diff --git a/google-api-go-generator/gen.go b/google-api-go-generator/gen.go index 099414eb04e..33e2ee9eb67 100644 --- a/google-api-go-generator/gen.go +++ b/google-api-go-generator/gen.go @@ -1477,7 +1477,8 @@ func (s *Schema) writeSchemaMarshal(forceSendFieldName, nullFieldsName string) { func (s *Schema) writeSchemaUnmarshal() { var floatProps []*Property for _, p := range s.properties() { - if p.p.Schema.Type == "number" { + if p.p.Schema.Type == "number" || + (p.p.Schema.Type == "array" && p.p.Schema.ItemSchema.Type == "number") { floatProps = append(floatProps, p) } } @@ -1495,6 +1496,9 @@ func (s *Schema) writeSchemaUnmarshal() { if p.forcePointerType() { typ = "*" + typ } + if p.p.Schema.Type == "array" { + typ = "[]" + typ + } pn("%s %s `json:\"%s\"`", p.assignedGoName, typ, p.p.Name) } pn(" *NoMethod") // embed the schema @@ -1509,6 +1513,11 @@ func (s *Schema) writeSchemaUnmarshal() { n := p.assignedGoName if p.forcePointerType() { pn("if s1.%s != nil { s.%s = (*float64)(s1.%s) }", n, n, n) + } else if p.p.Schema.Type == "array" { + pn("s.%s = make([]float64, len(s1.%s))", n, n) + pn(" for i := range s1.%s {", n) + pn(" s.%s[i] = float64(s1.%s[i])", n, n) + pn("}") } else { pn("s.%s = float64(s1.%s)", n, n) } diff --git a/google-api-go-generator/testdata/json-body.want b/google-api-go-generator/testdata/json-body.want index 4f799ea199e..0f03745281d 100644 --- a/google-api-go-generator/testdata/json-body.want +++ b/google-api-go-generator/testdata/json-body.want @@ -1314,14 +1314,19 @@ func (s *GoogleCloudMlV1__ParameterSpec) MarshalJSON() ([]byte, error) { func (s *GoogleCloudMlV1__ParameterSpec) UnmarshalJSON(data []byte) error { type NoMethod GoogleCloudMlV1__ParameterSpec var s1 struct { - MaxValue gensupport.JSONFloat64 `json:"maxValue"` - MinValue gensupport.JSONFloat64 `json:"minValue"` + DiscreteValues []gensupport.JSONFloat64 `json:"discreteValues"` + MaxValue gensupport.JSONFloat64 `json:"maxValue"` + MinValue gensupport.JSONFloat64 `json:"minValue"` *NoMethod } s1.NoMethod = (*NoMethod)(s) if err := json.Unmarshal(data, &s1); err != nil { return err } + s.DiscreteValues = make([]float64, len(s1.DiscreteValues)) + for i := range s1.DiscreteValues { + s.DiscreteValues[i] = float64(s1.DiscreteValues[i]) + } s.MaxValue = float64(s1.MaxValue) s.MinValue = float64(s1.MinValue) return nil diff --git a/google-api-go-generator/testdata/variants.want b/google-api-go-generator/testdata/variants.want index 957edc99225..4d4e0a1e630 100644 --- a/google-api-go-generator/testdata/variants.want +++ b/google-api-go-generator/testdata/variants.want @@ -475,6 +475,23 @@ func (s *MapFolder) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +func (s *MapFolder) UnmarshalJSON(data []byte) error { + type NoMethod MapFolder + var s1 struct { + DefaultViewport []gensupport.JSONFloat64 `json:"defaultViewport"` + *NoMethod + } + s1.NoMethod = (*NoMethod)(s) + if err := json.Unmarshal(data, &s1); err != nil { + return err + } + s.DefaultViewport = make([]float64, len(s1.DefaultViewport)) + for i := range s1.DefaultViewport { + s.DefaultViewport[i] = float64(s1.DefaultViewport[i]) + } + return nil +} + type MapItem map[string]interface{} func (t MapItem) Type() string { @@ -551,6 +568,23 @@ func (s *MapKmlLink) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +func (s *MapKmlLink) UnmarshalJSON(data []byte) error { + type NoMethod MapKmlLink + var s1 struct { + DefaultViewport []gensupport.JSONFloat64 `json:"defaultViewport"` + *NoMethod + } + s1.NoMethod = (*NoMethod)(s) + if err := json.Unmarshal(data, &s1); err != nil { + return err + } + s.DefaultViewport = make([]float64, len(s1.DefaultViewport)) + for i := range s1.DefaultViewport { + s.DefaultViewport[i] = float64(s1.DefaultViewport[i]) + } + return nil +} + type MapLayer struct { // DefaultViewport: An array of four numbers (west, south, east, north) // which defines the rectangular bounding box of the default viewport. @@ -600,3 +634,20 @@ func (s *MapLayer) MarshalJSON() ([]byte, error) { raw := NoMethod(*s) return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } + +func (s *MapLayer) UnmarshalJSON(data []byte) error { + type NoMethod MapLayer + var s1 struct { + DefaultViewport []gensupport.JSONFloat64 `json:"defaultViewport"` + *NoMethod + } + s1.NoMethod = (*NoMethod)(s) + if err := json.Unmarshal(data, &s1); err != nil { + return err + } + s.DefaultViewport = make([]float64, len(s1.DefaultViewport)) + for i := range s1.DefaultViewport { + s.DefaultViewport[i] = float64(s1.DefaultViewport[i]) + } + return nil +}