Skip to content

Commit 8a67fbf

Browse files
authored
Fix handling of empty prop name in json tag (#123)
1 parent b59113f commit 8a67fbf

File tree

2 files changed

+109
-4
lines changed

2 files changed

+109
-4
lines changed

reflect.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,8 +1032,9 @@ func (r *Reflector) walkProperties(v reflect.Value, parent *Schema, rc *ReflectC
10321032
}
10331033

10341034
deepIndirect := refl.DeepIndirect(field.Type)
1035+
propName := strings.Split(tag, ",")[0]
10351036

1036-
if tag == "" && field.Anonymous &&
1037+
if propName == "" && field.Anonymous &&
10371038
(field.Type.Kind() == reflect.Struct || deepIndirect.Kind() == reflect.Struct) {
10381039
forceReference := (field.Type.Implements(typeOfEmbedReferencer) && field.Tag.Get("refer") == "") ||
10391040
field.Tag.Get("refer") == "true"
@@ -1089,7 +1090,6 @@ func (r *Reflector) walkProperties(v reflect.Value, parent *Schema, rc *ReflectC
10891090
continue
10901091
}
10911092

1092-
propName := strings.Split(tag, ",")[0]
10931093
omitEmpty := strings.Contains(tag, ",omitempty")
10941094
required := false
10951095

reflect_test.go

Lines changed: 107 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1654,7 +1654,15 @@ func TestReflector_Reflect_deeplyEmbedded(t *testing.T) {
16541654
Baz float64 `json:"baz" title:"Bazzz."`
16551655
}
16561656

1657-
s, err := r.Reflect(My{})
1657+
val := My{}
1658+
val.DeeplyEmbedded = &DeeplyEmbedded{}
1659+
val.Foo = "abcde"
1660+
val.Bar = 123
1661+
val.Baz = 4.56
1662+
1663+
assertjson.EqMarshal(t, `{"foo":"abcde","bar":123,"baz":4.56}`, val)
1664+
1665+
s, err := r.Reflect(val)
16581666
require.NoError(t, err)
16591667

16601668
assertjson.EqMarshal(t, `{
@@ -1667,6 +1675,96 @@ func TestReflector_Reflect_deeplyEmbedded(t *testing.T) {
16671675
}`, s)
16681676
}
16691677

1678+
func TestReflector_Reflect_deeplyEmbedded_emptyJSONTags(t *testing.T) {
1679+
r := jsonschema.Reflector{}
1680+
1681+
type Embed struct {
1682+
Foo string `json:",omitempty" minLength:"5"` // Empty name in tag results in Go field name.
1683+
Bar int `json:"bar" minimum:"3"`
1684+
}
1685+
1686+
type DeeplyEmbedded struct {
1687+
Embed `json:""`
1688+
}
1689+
1690+
type My struct {
1691+
*DeeplyEmbedded `json:",inline"` // `inline` does not have any specific handling by encoding/json.
1692+
1693+
Baz float64 `json:"baz" title:"Bazzz."`
1694+
}
1695+
1696+
val := My{}
1697+
val.DeeplyEmbedded = &DeeplyEmbedded{}
1698+
val.Foo = "abcde"
1699+
val.Bar = 123
1700+
val.Baz = 4.56
1701+
1702+
assertjson.EqMarshal(t, `{"Foo":"abcde","bar":123,"baz":4.56}`, val)
1703+
1704+
s, err := r.Reflect(val)
1705+
require.NoError(t, err)
1706+
1707+
assertjson.EqMarshal(t, `{
1708+
"properties":{
1709+
"bar":{"minimum":3,"type":"integer"},
1710+
"baz":{"title":"Bazzz.","type":"number"},
1711+
"Foo":{"minLength":5,"type":"string"}
1712+
},
1713+
"type":"object"
1714+
}`, s)
1715+
}
1716+
1717+
func TestReflector_Reflect_deeplyEmbedded_validJSONTags(t *testing.T) {
1718+
r := jsonschema.Reflector{}
1719+
1720+
type Embed struct {
1721+
Foo string `json:"foo" minLength:"5"`
1722+
Bar int `json:"bar" minimum:"3"`
1723+
}
1724+
1725+
type DeeplyEmbedded struct {
1726+
Embed `json:"emb"`
1727+
}
1728+
1729+
type My struct {
1730+
*DeeplyEmbedded `json:"deep,inline"` // `inline` does not have any specific handling by encoding/json.
1731+
1732+
Baz float64 `json:"baz" title:"Bazzz."`
1733+
}
1734+
1735+
val := My{}
1736+
val.DeeplyEmbedded = &DeeplyEmbedded{}
1737+
val.Foo = "abcde"
1738+
val.Bar = 123
1739+
val.Baz = 4.56
1740+
1741+
assertjson.EqMarshal(t, `{"deep":{"emb":{"foo":"abcde","bar":123}},"baz":4.56}`, val)
1742+
1743+
s, err := r.Reflect(val)
1744+
require.NoError(t, err)
1745+
1746+
assertjson.EqMarshal(t, `{
1747+
"definitions":{
1748+
"JsonschemaGoTestDeeplyEmbedded":{
1749+
"properties":{"emb":{"$ref":"#/definitions/JsonschemaGoTestEmbed"}},
1750+
"type":"object"
1751+
},
1752+
"JsonschemaGoTestEmbed":{
1753+
"properties":{
1754+
"bar":{"minimum":3,"type":"integer"},
1755+
"foo":{"minLength":5,"type":"string"}
1756+
},
1757+
"type":"object"
1758+
}
1759+
},
1760+
"properties":{
1761+
"baz":{"title":"Bazzz.","type":"number"},
1762+
"deep":{"$ref":"#/definitions/JsonschemaGoTestDeeplyEmbedded"}
1763+
},
1764+
"type":"object"
1765+
}`, s)
1766+
}
1767+
16701768
func TestReflector_Reflect_deeplyEmbeddedUnexported(t *testing.T) {
16711769
r := jsonschema.Reflector{}
16721770

@@ -1685,7 +1783,14 @@ func TestReflector_Reflect_deeplyEmbeddedUnexported(t *testing.T) {
16851783
Baz float64 `json:"baz" title:"Bazzz."`
16861784
}
16871785

1688-
s, err := r.Reflect(My{})
1786+
val := My{}
1787+
val.Foo = "abcde"
1788+
val.Bar = 123
1789+
val.Baz = 4.56
1790+
1791+
assertjson.EqMarshal(t, `{"foo":"abcde","bar":123,"baz":4.56}`, val)
1792+
1793+
s, err := r.Reflect(val)
16891794
require.NoError(t, err)
16901795

16911796
assertjson.EqMarshal(t, `{

0 commit comments

Comments
 (0)