2016-07-29 2 views
4

저는 Go에서 매우 새롭고 탐구 중이 었는데 내 마이크로 서비스 중 하나를 사용하려고합니다. Go가 객체를 Json으로 변환하고 Json으로 다시 변환하는 방법이 궁금했습니다. 하지만 불행히도 출력 필드 이름을 구성하는 것이 태그 이름을 사용하는 것이 거의 어렵다는 것을 알게되었습니다.Go JSON 명명 전략

type MyStruct strust{ 
    MyName string 
} 

의지

{ 
    "MyName" : "somestring" 
} 

를 JSON으로 변환하지만 우리는

{ 
     "my_name" : "somestring" 
} 

가 내 조직에 유효한 것으로 간주됩니다 snake_case 따라 조직 전체에 걸쳐 전체 API에 대한 네이밍 전략을 따르고 있습니다.

필드 수준 당 json:"my_name,omitempty" 등의 태그를 사용하기 시작했습니다.

내가 알고 싶은 것은 글로벌 프로젝트 레벨에서 구성 할 수있는 방법이 있다는 것이다. 그래서 모든 객체와 필드 레벨에서이 점을주의하고 싶다.

+0

이 방법으로 사용할 수있는 다른 go json 라이브러리가 있습니까? 나는 그 태그를 수동으로 태그에 db 열 및 Json 필드 이름에 대한 이름을 입력해야만한다면 그 좋은 날 golang을 사용하는 생각하지 않아요 ... 나는 아름다운 언어에서 더 큰 단점을 생각합니다. – 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

@Ysak 시간 지연에 대해 말하기 : 위의 코드는 30 분 이내에 작성된 것으로 가정하고 "생산"준비가 완료 될 때까지 한 시간 더 제공한다고 가정합니다. 핵심 기능에 2 시간을 헌신 할 수 없다면 언어 선택의 문제보다 더 큰 문제가있을 것입니다 ... – icza