2016-07-29 121 views
4

我在Go中非常新,我正在探索使用我的微服務之一。我很想知道Go將對象轉換成Json並返回給Json的方式。但不幸的是,我發現配置輸出字段名稱使用標籤名稱很困難。Go JSON命名策略

type MyStruct strust{ 
    MyName string 
} 

意願轉換成JSON

{ 
    "MyName" : "somestring" 
} 

但我們正在跟蹤整個組織的整個API命名策略遵循snake_case

{ 
     "my_name" : "somestring" 
} 

被認爲是在我的組織有效。

我開始使用每個字段級別的標籤,如json:"my_name,omitempty"等。

我想知道是否有一種方法可以在全局項目級別對其進行配置,以便我不希望在每個對象和其字段級別都關注這一點。

+0

是否有任何其他的去json庫,我可以用這種方式使用。我不認爲它很好用我使用golang,然後如果我必須在標籤中手動輸入db列和Json字段名稱的名稱...我認爲它來自美麗語言的更大缺點。 – Ysak

回答

3

你可以嘗試這樣的事:https://play.golang.org/p/i5X69ywjup

核心功能:

// SnakeCaseEncode snake_case's the given struct's field names. 
func SnakeCaseEncode(i interface{}) map[string]interface{} { 
    rt, rv := reflect.TypeOf(i), reflect.ValueOf(i) 

    if rt.Kind() == reflect.Ptr { 
     i := reflect.Indirect(rv).Interface() 
     rt, rv = reflect.TypeOf(i), reflect.ValueOf(i) 
    } 

    out := make(map[string]interface{}, rt.NumField()) 

    for i := 0; i < rt.NumField(); i++ { 
     if strings.Contains(rt.Field(i).Tag.Get("json"), "omitempty") { 
      continue 
     } 

     k := snakeCase(rt.Field(i).Name) 

     out[k] = rv.Field(i).Interface() 
    } 

    return out 
} 

// snakeCase provides basic ASCII conversion of camelCase field names to snake_case. 
func snakeCase(s string) string { 
    out := make([]rune, 0, utf8.RuneCountInString(s)) 

    for i, r := range s { 
     if r >= 'A' && r <= 'Z' { 
      r += 32 

      if i > 0 { 
       out = append(out, '_') 
      } 
     } 

     out = append(out, r) 
    } 

    return string(out) 
} 

爲了支持地圖,切片等,你必須要在這個簡單的版本擴大。

+1

請在答案中包含代碼(至少顯示您的原則的部分)。 – icza

+0

試過這個......它看起來不錯....但我期待着一個經過良好測試的圖書館爲此目的。專注於爲我的項目實現此功能可能會導致我的項目不必要的延遲,因爲我不得不擔心我的項目中的所有這些內容......我認爲最好堅持使用其他語言,因爲現在......謝謝你們,接受這個答案,因爲我無法看到比這更好的解決方案。 – Ysak

+2

@Yakak談及時間延遲:我假設上述代碼是在不到半個小時的時間內完成的,並且可以在「生產」準備就緒的情況下再投入一小時。如果你不能在覈心功能上投入2個小時,你將會遇到比語言選擇更大的問題... – icza