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.