Browse Source

fix #276 allow rename when set naming strategy

Tao Wen 7 years ago
parent
commit
ab8a2e0c74
2 changed files with 38 additions and 0 deletions
  1. 11 0
      extra/naming_strategy.go
  2. 27 0
      extra/naming_strategy_test.go

+ 11 - 0
extra/naming_strategy.go

@@ -2,6 +2,7 @@ package extra
 
 import (
 	"github.com/json-iterator/go"
+	"strings"
 	"unicode"
 )
 
@@ -17,6 +18,16 @@ type namingStrategyExtension struct {
 
 func (extension *namingStrategyExtension) UpdateStructDescriptor(structDescriptor *jsoniter.StructDescriptor) {
 	for _, binding := range structDescriptor.Fields {
+		tag, hastag := binding.Field.Tag().Lookup("json")
+		if hastag {
+			tagParts := strings.Split(tag, ",")
+			if tagParts[0] == "-" {
+				continue // hidden field
+			}
+			if tagParts[0] != "" {
+				continue // field explicitly named
+			}
+		}
 		binding.ToNames = []string{extension.translate(binding.Field.Name())}
 		binding.FromNames = []string{extension.translate(binding.Field.Name())}
 	}

+ 27 - 0
extra/naming_strategy_test.go

@@ -21,3 +21,30 @@ func Test_lower_case_with_underscores(t *testing.T) {
 	should.Nil(err)
 	should.Equal(`{"user_name":"taowen","first_language":"Chinese"}`, string(output))
 }
+
+func Test_set_naming_strategy_with_overrides(t *testing.T) {
+	should := require.New(t)
+	SetNamingStrategy(LowerCaseWithUnderscores)
+	output, err := jsoniter.Marshal(struct {
+		UserName      string `json:"UserName"`
+		FirstLanguage string
+	}{
+		UserName:      "taowen",
+		FirstLanguage: "Chinese",
+	})
+	should.Nil(err)
+	should.Equal(`{"UserName":"taowen","first_language":"Chinese"}`, string(output))
+}
+
+func Test_set_naming_strategy_with_omitempty(t *testing.T) {
+	should := require.New(t)
+	SetNamingStrategy(LowerCaseWithUnderscores)
+	output, err := jsoniter.Marshal(struct {
+		UserName      string
+		FirstLanguage string `json:",omitempty"`
+	}{
+		UserName: "taowen",
+	})
+	should.Nil(err)
+	should.Equal(`{"user_name":"taowen"}`, string(output))
+}