Go에서 JSON의 Snake Case 키를 Camel Case로 변환
질문:
In 자, 어떻게 JSON의 snake_case 키를 camelCase 키로 재귀적으로 변환할 수 있나요? 이는 주요 형식이 다를 수 있는 Elasticsearch와 같은 데이터 저장소에서 데이터를 수신하는 동안 API 응답 JSON을 내부 표준에 맞추는 것과 특히 관련이 있습니다.
답변:
이를 달성하려면 전환을 통해 여러 가지 접근 방식을 활용할 수 있습니다. 한 가지 효과적인 방법은 고유한 필드 태그가 있는 두 개의 구조체를 정의하는 Go 1.8의 기능을 활용하는 것입니다. 태그를 주의 깊게 작성하면 두 구조체 간에 손쉽게 변환하여 원하는 키 변환을 효과적으로 적용할 수 있습니다.
태그를 사용한 코드 예:
<code class="go">package main import ( "encoding/json" "fmt" ) type ESModel struct { AB string `json:"a_b"` } type APIModel struct { AB string `json:"aB"` } func main() { b := []byte(`{ "a_b": "c" }`) var x ESModel json.Unmarshal(b, &x) b, _ = json.MarshalIndent(APIModel(x), "", " ") fmt.Println(string(b)) }</code>
재귀적 맵 기반 접근 방식:
또 다른 포괄적인 전략은 JSON 문서를 맵으로 역마샬링하는 것입니다. 작업이 성공하면 체계적으로 키를 수정하고 각 맵 값에 대해 키 변환 기능을 반복적으로 실행할 수 있습니다. 다음 예에서는 모든 키를 대문자로 변환하는 방법을 보여줍니다. FixKey 함수는 구현 시 snake_case 변환 함수로 대체되어야 합니다.
<code class="go">package main import ( "bytes" "encoding/json" "fmt" "strings" ) func main() { // Document source as returned by Elasticsearch b := json.RawMessage(`{ "a_b": "c", "d_e": ["d"], "e_f": { "g_h": { "i_j": "k", "l_m": {} } } }`) x := convertKeys(b) buf := &bytes.Buffer{} json.Indent(buf, []byte(x), "", " ") fmt.Println(buf.String()) } func convertKeys(j json.RawMessage) json.RawMessage { m := make(map[string]json.RawMessage) if err := json.Unmarshal([]byte(j), &m); err != nil { // Not a JSON object return j } for k, v := range m { fixed := fixKey(k) delete(m, k) m[fixed] = convertKeys(v) } b, err := json.Marshal(m) if err != nil { return j } return json.RawMessage(b) } func fixKey(key string) string { return strings.ToUpper(key) }</code>
위 내용은 Go JSON에서 Snake Case 키를 Camel Case로 변환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!