>백엔드 개발 >Golang >golang의 구조체에서 json 객체를 수동으로 생성

golang의 구조체에서 json 객체를 수동으로 생성

WBOY
WBOY앞으로
2024-02-12 11:03:081107검색

golang의 구조체에서 json 객체를 수동으로 생성

golang에서는 구조체에서 json 객체를 수동으로 생성하는 것이 일반적인 작업입니다. 구조체를 json 형식으로 변환하면 네트워크 전송이나 저장에 쉽게 사용할 수 있습니다. 이 기사에서는 PHP 편집기인 Banana가 이 기능을 구현하기 위해 golang의 내장 패키지를 사용하는 방법을 소개합니다. 그뿐만 아니라 구조체의 중첩 필드를 처리하는 방법과 특수한 유형의 필드를 처리하는 방법도 살펴보겠습니다. 당신이 초보자이든 숙련된 개발자이든, 이 글은 golang에서 json 객체를 쉽게 생성하는 데 도움이 되는 자세한 지침을 제공할 것입니다. 시작하자!

질문 내용

말할 구조가 있어요

으아아아

이런 식으로 쉽게 json으로 변환할 수 있다는 걸 알아요

으아아아

빈 json 문자열을 반환합니다.

하지만 json에 있는 모든 필드와 "null 값"이 포함된 구조의 json 표현을 반환하려면 동일한 구조를 사용해야 합니다. (사실 구조가 너무 커서 태그 없이는 복사본만 보관할 수가 없어요)

가장 쉬운 방법은 무엇인가요?

기본적으로 json 생략 태그를 무시하는 구조의 json 마샬을 만들어야 합니다.

이 json 생성은 효율적이거나 성능이 좋을 필요는 없습니다.

이런 종류의 작업을 위해서는 라이브러리를 선호했지만, 제가 본 대부분의 라이브러리는 특별한 형식을 만들거나 생략을 존중합니다

편집자:

내 답변으로 https://stackoverflow.com/a/77799949/2187510을 선택하고 기본값을 허용하도록 추가 작업을 수행합니다(해당 코드를 참조로 사용)

으아아아

출력:

<code>type Foo struct {
  A string `json:",omitemtpy"
}
</code>

해결 방법

런타임에 태그를 수정할 수는 없지만 $$c$$reflect.StructOf()를 사용하여 런타임에 구조체 유형을 생성할 수 있습니다.

그래서 아이디어는 구조체 유형을 복사하되 중복의 ​​JSON 태그에서 ,omitempty<code>,omitempty 옵션을 제외하는 것입니다.

아래의 모든 예시는 Go Playground에서 찾아보실 수 있습니다.

사람들이 처음 생각하는 것보다 쉽습니다. 우리는 그것을 재귀적으로 수행해야 하며(하나의 구조체 필드는 다른 구조체일 수 있음) 포인터를 확실히 처리해야 합니다.

으아아아

다음 유형으로 테스트해 보겠습니다.

으아아아

먼저, 유형 중복이 없는 JSON 출력은 다음과 같습니다.

으아아아

출력:

으아아아

Bar<code>BarBazBaz

필드는 구조체이기 때문에 가져옵니다.

다음을 입력해 보세요:

으아아아

다음과 같이 출력됩니다:

으아아아

나쁘지 않아요! 정확히 우리가 원했던 것!

하지만 아직 끝나지 않았습니다. 구조 포인터 필드가 있는 유형이 있으면 어떻게 되나요? 이렇게:

으아아아

반복되는 유형의 값을 JSON으로 마샬링해 보세요.

으아아아

출력:

으아아아 null,但我们也希望它们的字段也出现在输出中。这需要将它们初始化为非 nil구조물에 포인터가 포함된 경우 이러한 포인터는 JSON 출력에서 ​​null

으로 표시되지만 해당 필드도 출력에 표시되기를 원합니다. 출력을 생성하려면 nil<p>이 아닌 값으로 초기화해야 합니다. </p> <p>다행히도 리플렉션을 사용하여 이 작업을 수행할 수도 있습니다. </p> 으아아아 <p>기뻐요! 실제로 살펴보겠습니다: </p> 으아아아 <p>출력: </p> 으아아아 🎜나쁘지 않아요! 모든 필드가 포함되어 있습니다! 🎜

위 내용은 golang의 구조체에서 json 객체를 수동으로 생성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제