diff --git a/bootstrap/bootstrap.go b/bootstrap/bootstrap.go index 0322511..4729d18 100644 --- a/bootstrap/bootstrap.go +++ b/bootstrap/bootstrap.go @@ -24,6 +24,7 @@ type Generator struct { NoStdMarshalers bool SnakeCase bool + LowerCamelCase bool OmitEmpty bool OutName string @@ -110,6 +111,9 @@ func (g *Generator) writeMain() (path string, err error) { if g.SnakeCase { fmt.Fprintln(f, " g.UseSnakeCase()") } + if g.SnakeCase { + fmt.Fprintln(f, " g.UseLowerCamelCase()") + } if g.OmitEmpty { fmt.Fprintln(f, " g.OmitEmpty()") } diff --git a/easyjson/main.go b/easyjson/main.go index 6287926..1c39497 100644 --- a/easyjson/main.go +++ b/easyjson/main.go @@ -18,6 +18,7 @@ import ( var buildTags = flag.String("build_tags", "", "build tags to add to generated file") var snakeCase = flag.Bool("snake_case", false, "use snake_case names instead of CamelCase by default") +var lowerCamelCase = flag.Bool("lower_camel_case", false, "use lowerCamelCase names instead of CamelCase by default") var noStdMarshalers = flag.Bool("no_std_marshalers", false, "don't generate MarshalJSON/UnmarshalJSON funcs") var omitEmpty = flag.Bool("omit_empty", false, "omit empty fields by default") var allStructs = flag.Bool("all", false, "generate marshaler/unmarshalers for all structs in a file") @@ -59,6 +60,7 @@ func generate(fname string) (err error) { PkgName: p.PkgName, Types: p.StructNames, SnakeCase: *snakeCase, + LowerCamelCase: *lowerCamelCase, NoStdMarshalers: *noStdMarshalers, OmitEmpty: *omitEmpty, LeaveTemps: *leaveTemps, diff --git a/gen/generator.go b/gen/generator.go index 988a3a5..4e8c5b8 100644 --- a/gen/generator.go +++ b/gen/generator.go @@ -11,6 +11,7 @@ import ( "strconv" "strings" "unicode" + "unicode/utf8" ) const pkgWriter = "github.com/mailru/easyjson/jwriter" @@ -99,6 +100,11 @@ func (g *Generator) UseSnakeCase() { g.fieldNamer = SnakeCaseFieldNamer{} } +// UseLowerCamelCase sets lowerCamelCase field naming strategy. +func (g *Generator) UseLowerCamelCase() { + g.fieldNamer = LowerCamelCaseFieldNamer{} +} + // NoStdMarshalers instructs not to generate standard MarshalJSON/UnmarshalJSON // methods (only the custom interface). func (g *Generator) NoStdMarshalers() { @@ -374,6 +380,25 @@ func (DefaultFieldNamer) GetJSONFieldName(t reflect.Type, f reflect.StructField) } } +// LowerCamelCaseFieldNamer +type LowerCamelCaseFieldNamer struct {} +func lowerFirst(s string) string { + if s == "" { + return "" + } + r, n := utf8.DecodeRuneInString(s) + return string(unicode.ToLower(r)) + s[n:] +} + +func (LowerCamelCaseFieldNamer) GetJSONFieldName(t reflect.Type, f reflect.StructField) string { + jsonName := strings.Split(f.Tag.Get("json"), ",")[0] + if jsonName != "" { + return jsonName + } else { + return lowerFirst(f.Name) + } +} + // SnakeCaseFieldNamer implements CamelCase to snake_case conversion for fields names. type SnakeCaseFieldNamer struct{}