Go에서 JSON Marshal을 사용한 소문자 JSON 키 이름


175

"encoding/json"패키지 를 사용하여 내 응용 프로그램의 가져온 패키지 중 하나에 선언 된 구조체를 마샬링하고 싶습니다.

예 :

type T struct {
    Foo int
}

가져 오기 때문에 구조체에서 사용 가능한 모든 (내 보낸) 필드는 대문자로 시작합니다. 그러나 소문자 키 이름을 원합니다.

out, err := json.Marshal(&T{Foo: 42})

결과

{ "푸": 42}

그러나 나는 얻고 싶다

{ "foo": 42}

쉬운 방법으로 문제를 해결할 수 있습니까?


5
@ Zippoxer : 나는 말할 것입니다 : 클라이언트 / 서버 통신 프로토콜의 키는 소문자로 엄격하게 정의됩니다. 글쎄, 내 경우에는 프로토콜을 직접 정의했기 때문에 중요하지 않지만 이론 상으로는 적어도? 그러나 나는 그것이 어리석은 작은 세부 사항에 너무 많은 시간을 소비한다는 것만 알고 있습니다.
아니스

사과하지 마십시오. 당신은 바보 같은 것이 아니며, 전체 json 사양을 받아들이지 않는 언어는 바보 같은 것입니다 (아래와 같이 문제가 쉽게 해결되지만).
Jehan

@ ANisus : JSON 키 이름이 아닌 구조체 키 이름에 대한 질문을 잘못 읽었습니다. 투표를 철회했습니다.
Flimzy 2016 년

답변:


265

encoding / json.Marshal 에 대한 문서를 살펴보십시오 . 생성 된 JSON이 형식화되는 방법을 판별하기 위해 구조체 필드 태그 사용에 대해 설명합니다.

예를 들면 다음과 같습니다.

type T struct {
    FieldA int    `json:"field_a"`
    FieldB string `json:"field_b,omitempty"`
}

다음과 같이 JSON이 생성됩니다.

{
    "field_a": 1234,
    "field_b": "foobar"
}

8
필드 태그? 오 마이 .. 문서를 검색 할 때이 전체 부분을 놓쳤습니다. 플래그, 함수 또는 다른 설정을 찾고있었습니다. 글쎄, 이것은 내가 찾던 정확한 답변입니다! 또한, 나는 다음에 대해 배울 새로운 Go 개념을 가지고 있습니다 : field tags :)
ANisus

그들은 매우 편리합니다. reflect패키지를 통해 런타임에 액세스 할 수 있습니다 .
jimt

예, 리플렉션 작업을 할 때 필드에 메타 데이터를 추가하는 방법이 얼마나 멋진 지 알 수 있습니다. Btw, 방금 답변을 시도했습니다. 매력처럼 작동합니다.
아니스

5
나는 방금 언어를 저주하기 시작했습니다. 어리석은 일이며, 생성 된 JSON 등에서 소문자로 필드를 만드는 이유 등입니다. 그런 다음이 스레드를 발견하고 "OMG That 's brilliant !!!"라고 생각했습니다. 난 뛰어 난 너무 흥분 왜 내 여자 친구를 설명 : D 그것은 너무) : 멋진)
nyxz

11
콜론과 태그의 첫 번째 인용 부호 사이에 공백이 없는지 확인하십시오! json:"some_tag"대신에 사용하십시오 json: "some_tag". 나는 이것에 대해 조금 물었다.
David Morales

8

내보내려는 키로 자신의 구조체를 만들고 소문자 이름에 적합한 json 태그를 제공 할 수 있습니다. 그런 다음 JSON으로 인코딩하기 전에 원하는 구조체를 구조체에 복사 할 수 있습니다. 또는 로컬 구조체를 만드는 데 신경 쓰지 않으려면 아마도 map[string]interface{}그것을 만들고 인코딩 할 수 있습니다.


바보 같은 것은 다른 패키지 (유형 포함)도 실제로 내 것입니다. 그러나 그렇습니다. 아마도 그것이 구조체 여야한다는 사실을 맹목적으로 바라 보았습니다. map[string]interface{}중첩 된 객체 / 구조체로
끝나지 않는 한를

1
@ ANisus : 오, 내 대답은 당신이 구조체의 정의를 제어하지 않는 것으로 전제되었습니다. jimt의 대답은 분명히 당신이 원하는 것입니다.
릴리 발라드

예, 외부 패키지인지 여부는 확실하지 않았습니다. 그러나 정의를 제어하지 않는 경우에도 귀하의 답변은 여전히 ​​관련성이 있고 유용합니다.
아니스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.