내 하루 작업의 대부분은 TypeScript와 PHP이지만 뒤에 툴링의 좋은 덩어리입니다 Toolz.dev 그리고 제가 그 주위에 쓰는 작은 서비스는 Go 입니다,그리고 매번 새로운 API 클라이언트를 연결시킬 때마다 저는 같은 벽에 부딪혔습니다. 여러분은 여러분 앞에 JSON 응답을 가지고 있고,여러분은 Go 구조체가 필요합니다 json.Unmarshal 로 해독할 것입니다. 손으로 그 구조체를 쓰는 것은 매우 구체적인 방법으로 지루합니다: 그것은 어렵지 않고,단지 까다롭고,까다로운 비트는 정확히 여러분이 실수를 하는 곳입니다. 그래서 저는 사이트에 변환기를 만들었고,이것이 그것에 대한 안내입니다.
TL;DR: 툴즈 JSON to Go 구조체 변환기 JSON 문서를 구문 분석하고 이를 설명하는 Go 유형 선언을 내보냅니다. 개체는 인라인 구조체가 되고 개체 배열은 하나의 구조체로 병합되며 모든 필드는 a를 얻습니다
json:"key"태그 soencoding/json데이터를 올바르게 다시 매핑합니다. 필드 이름은 Go 규칙을 따르므로id된다ID그리고user_url된다UserURL. 정수를 로 전환합니다int64, 추가하다omitempty를,그리고 루트 타입의 이름을 바꿉니다. 그것은 전적으로 클라이언트 측에서 실행됩니다: 업로드 없음,가입 없음,오프라인에서 작동합니다.
JSON to Go 구조체 변환기란 무엇입니까?
JSON to Go 구조체 변환기는 JSON 문서를 설명하는 Go 타입 선언으로 바꾸므로,표준 library's 로 동일한 데이터를 디코딩할 수 있습니다 encoding/json 손으로 구조체를 입력하는 대신 패키지. 모든 JSON 객체는 Go 구조체가 되고,모든 필드는 a 를 운반합니다 json:"key" 원래 이름으로 다시 매핑하는 태그,그리고 스칼라 타입은 값으로부터 추론됩니다. JSON 문자열이 됩니다 string는, 정수가 됩니다 int는, 소수점을 가진 숫자가 됩니다 float64, true 그리고 false 되다 bool, 그리고 null 된다 interface{}.
이것이 유용한 이유는 JSON 객체와 Go 구조체가 같은 모양,입력된 값을 가진 명명된 필드 집합을 설명하지만 Go 는 정적으로 입력되고 JSON 은 그렇지 않기 때문에 구조체는 모든 유형을 앞에 철자해야 합니다. 샘플 응답에서 이러한 유형을 도출하는 것은 순수 역학이며 중첩된 페이로드를 통해 손으로 수행되는 역학은 버그가 살고 있는 곳입니다. 변환기는 결정론적으로 파생을 수행하고 컴파일하는 유형 블록을 다시 건네줍니다.
순진한 변환기가 잘못되는 것이기 때문에 문제의 두 부분에 대해 분명히 할 가치가 있습니다. 첫 번째는 이름 지정입니다: Go는 내보낸 필드만 인코딩하고 대문자 첫 글자가 있는 필드는 커뮤니티 보푸라기 규칙은 공통 이니셜을 완전히 대문자로 표기하기를 원합니다. 두 번째는 태그입니다: the json:"..." 태그는 정확한 원본 키를 보유해야 합니다 json.Unmarshal 오류 없이 런타임에 필드를 자동으로 건너뜁니다. 둘 중 하나를 잘못 가져오면 모든 것이 괜찮아 보이는 동안 디코드에서 0 값으로 가득 찬 구조체를 반환합니다. 이 도구는 두 가지를 모두 처리합니다.
구조체를 손으로 작성해 보는 것은 어떨까요?
이것은 정직한 질문입니다. 왜냐하면 평평한 3 필드 객체의 경우 구조체를 손으로 쓰는 것이 도구를 여는 것보다 빠르기 때문입니다. 변환기는 평평하지 않은 응답에서 그 자리를 얻습니다: 중첩 된 객체,객체 배열 및 키의 절반이있는 20 개의 필드가있는 페이로드 snake_case 그리고 몇 가지는 다음과 같은 두문자어입니다 id, url, 그리고 api_key.
그런 응답에서 손으로 쓴 버전에는 내가 반복적으로 치는 세 가지 실패 모드가 있습니다. 필드를 내보내는 것을 잊어 버렸으므로 소문자로 유지됩니다 encoding/json 채우기를 거부합니다. 필드를 대문자로 표시하지만 태그는 잊어버립니다 UserName 라는 JSON 키를 찾습니다 UserName 그리고 결코 찾지 못합니다 user_name. 또는 JSON 이 실제로 배열로 필드를 래핑할 때 필드를 일반 구조체로 선언하여 중첩을 잘못 수행하게 됩니다. 이들 중 어느 것도 컴파일 오류가 아닙니다. 누락된 데이터로 표시되는 런타임 놀라움이며 전체 구조체를 생성하는 데 소비한 것보다 그 중 하나를 디버깅하는 데 더 많은 시간을 낭비하게 됩니다.
변환기는 세 가지를 모두 제거합니다. 모든 필드를 내보내고 실제 키에서 태그를 쓰고 실제 JSON 모양을 읽어 구조체와 구조체 조각 중 하나를 결정합니다. 붙여넣는 것은 유형을 얻는 것입니다.
여기 한 테이블의 결정이 있습니다.
| 상황 | 사용 | 왜 |
|---|---|---|
| 두 개 또는 세 개의 필드가 있는 평평한 개체입니다 | 손으로 쓰세요 | 어떤 것을 여는 것보다 더 빨리 |
| 많은 필드가 있는 중첩 API 응답입니다 | JSON to Go 구조체 변환기 | 이름 지정 및 태그는 손으로 쓴 구조체가 끊어지는 곳입니다 |
| TypeScript 와 같은 모양이 필요합니다 | JSON에서 TypeScript로 변환합니다 | 동일한 추론, 다른 대상 언어 |
| 유형이 아닌 유효성 검사 스키마를 원합니다 | JSON 스키마 생성기 | Go 유형이 아닌 Draft-07 규칙 |
Go 필드 이름이 JSON 키와 다른 이유는 무엇입니까?
이것은 처음으로 사람들을 넘어 뜨리기 때문에 숨기보다는 설명 할 가치가 있습니다. Go's encoding/json 패키지는 보안관과 보안관만 해당됩니다 수출된 struct fields,이름이 대문자로 시작하는 필드를 뜻한다. A JSON key like user_name 내보내지 않은 항목에 매핑할 수 없습니다 user_name 필드이므로 필드 이름을 내보낸 것으로 변경해야 합니다. 도구는 각 단어를 대문자로 사용하여 회전합니다 user_name 안으로 UserName.
그 위에, Go 커뮤니티's lint 툴링, 로 시작된 규칙 golint 그리고 다음과 같은 도구를 계속 사용하세요 staticcheck는,모든 대문자로 쓰여진 공통 두문자를 원한다. 그래서 id 된다 ID, 아니다 Id; user_url 된다 UserURL, 아니다 UserUrl; 그리고 html_body 된다 HTMLBody. 변환기는 두문자어의 표준 집합을 알고 있습니다 ID, URL, API, HTTP, JSON, UUID그리고 나머지는 이를 적용하므로 출력은 CI가 실행할 린터를 통과합니다.
이름 바꾸기를 안전하게 만드는 조각은 태그입니다. 모든 필드는 a 를 얻습니다 json:"user_name" 원본 키를 정확하게 잡고 있는 태그이므로 런타임에 json.Unmarshal JSON 키를 읽습니다 user_name 그리고 그것을 에 씁니다 UserName 이름 변경에 관계없이 필드. JSON 및 Go 에 대한 Go blog's 문서는 이 태그 메커니즘을 문서화하며,이름이 변경된 필드가 여전히 올바르게 디코딩되는 이유입니다. 태그가 없으면 이름이 변경된 구조체는 조용히 채우지 못할 것입니다.
개체의 숫자와 배열은 어떻게 처리되나요?
추론의 두 부분은 변환기의 품질이 다르기 때문에 자세히 살펴볼 가치가 있습니다.
먼저 숫자. JSON 은 단일 숫자 유형을 가지고 있지만 Go 는 그렇지 않으므로 도구가 선택해야 합니다. 분수 부분이 없는 값이 됩니다 int, 또는 int64 해당 옵션을 켜면 소수점이 있는 값이 됩니다 float64. 흥미로운 경우는 그것들을 혼합하는 배열입니다 [9.5, 8, 7.2]. 도구가 다음과 같이 입력한 경우 []int 디코딩에 실패합니다 9.5, 그래서 전체 슬라이스를 넓힙니다 []float64. 한 요소가 더 넓은 유형을 강제하는 모든 배열은 모든 요소에 대해 더 넓은 유형을 가져오며,이는 모든 값을 디코딩하는 유일한 선택입니다.
객체의 배열은 실제 페이로드가 흥미로워지는 다른 장소입니다. API 는 거의 모든 객체가 동일한 키 세트를 갖는 배열을 제공하지 않습니다; 한 요소에는 다른 요소가 생략한 필드가 있거나,nullable 필드가 여기에 있고 거기에 없습니다. 도구가 첫 번째 요소에서만 구조체를 생성하면 나중에 나타나는 키가 삭제됩니다. 대신 배열의 모든 객체를 모든 요소가 가진 모든 키를 포함하는 하나의 구조체로 병합합니다. 그리고 두 요소가 동일한 키 호환되지 않는 유형,즉 하나의 숫자와 다른 하나의 문자열을 제공하면 해당 필드는 뒤로 넘어집니다 interface{} 도구가 잘못 추측하거나 완전히 실패하는 것이 아니라,결과적으로 전체 배열을 디코딩할 수 있는 단일 구조체 유형이 됩니다.
컨버터는 어떻게 사용하나요?
흐름은 네 단계입니다. 입력 상자에 JSON 개체 또는 배열을 붙여 넣습니다; 출력의 모양을 먼저 보려면 샘플을로드하십시오. 루트 유형에 이름을 지정하십시오 User 또는 ApiResponse그리고 도구는 유효한 내보낸 Go 식별자로 정리하여 작성된 대로 컴파일합니다. 선택 int 또는 int64 정수의 경우 켜십시오 omitempty 구조체가 나중에 JSON 으로 다시 인코딩될 때 값이 0 인 필드를 생략하려면 변환을 클릭하고 구조체를 복사합니다 .go 파일.
JSON 이 유효하지 않은 경우 도구는 묵묵히 실패하는 대신 parser's 자체 오류 메시지를 보고하므로 길 잃은 후행 쉼표 또는 인용되지 않은 키를 빠르게 찾을 수 있습니다. 그리고 모든 것이 브라우저에서 실행되기 때문에 개인 필드가 있는 응답을 포함하여 실제 API 응답을 붙여넣을 수 있습니다. 해당 클라이언트 측 모델은 사이트의 나머지 부분 뒤에 있는 것과 동일합니다 데이터 개인 정보 보호 온라인 도구 가이드.
이것이 다른 JSON 도구와 어떻게 맞습니까?
JSON to Go 구조체 변환기는 사이트에 있는 JSON 변압기 제품군의 한 구성원이며 동일한 구문 분석 코어를 공유합니다. JSON을 먼저 정리하고 싶을 때, JSON 포맷터 들여쓰기하고 유효성을 검사합니다. 변환하기 전에 입력하려는 모양을 읽을 수 있도록 할 가치가 있습니다. 대상 언어가 Go가 아닌 TypeScript인 경우 JSON에서 TypeScript로 변환합니다 동일한 추론을 실행하고 인터페이스를 내보냅니다. 언어 유형 대신 유효성 검사 계약이 필요한 경우,the JSON 스키마 생성기 draft-07 스키마를 생성하고 대상이 PHP 코드베이스인 경우 JSON-PHP 배열 변환기 배열을 리터럴로 씁니다.
그들 모두를 연결하는 스레드는 JSON 을 구조의 소스로 취급하고 그 구조를 코드베이스가 말하는 모든 것으로 번역한다는 것입니다. 여러 언어에서 작업하는 경우,the 웹 개발자 툴킷 검거는 이러한 조각이 어떻게 함께 배열되는지 보여줍니다 코딩 도구 가이드 더 넓은 포맷터 및 변환기 세트를 다룹니다.
Go 서비스 구축의 실제 사례입니다
이것을 구체적으로 만들어 보겠습니다. 얼마 전 저는 타사 API 에서 데이터를 가져와 슬림 한 버전을 다시 노출시키는 작은 Go 서비스를 작성하고있었습니다. vendor's 응답은 중첩 된 개체였습니다: a 가있는 최상위 레코드 owner 하위 객체, a tags 문자열 배열 및 a scores 성가시게도 필드에 따라 정수와 소수를 혼합하는 배열입니다. 구조체를 손으로 입력한다는 것은 다음을 얻는 것을 의미했습니다 owner 오른쪽에 중첩하고 모두 태그를 지정합니다 snake_case 키를 누르고 혼합 배열에 대해 무엇을 해야 할지 결정합니다.
샘플 응답을 변환기에 붙여넣고 리소스 이름을 따서 루트 유형 이름을 지정한 다음 구조체를 다시 얻었습니다 Owner 인라인 중첩 구조체로서, Tags 처럼 []string, 그리고 Scores 올바르게 확장되었습니다 []float64. 그만큼 id 필드는 다음과 같이 나왔습니다 ID a와 함께 json:"id" 태그,그래서 둘 다 린터를 통과하고 실제 키를 디코딩했습니다. 클라이언트 패키지에 바로 복사하고 로직으로 넘어갔는데,여기서 실제로 시간을 보내고 싶었습니다. 구조체는 작업의 흥미로운 부분이 아니었고,생성한다는 것은 작업의 어떤 부분도 되지 않는다는 것을 의미했습니다.
내가 이러한 스팟에서 손으로 쓴 구조체가 아닌 컨버터에 도달하는 이유는 게으름이 아니라, 기계적인 부분, 내보내기, 태깅, 중첩이 내가 논리에 대해 생각하고 있을 때 내가 틀리는 부분이기 때문이다. 결정론적 도구로 오프로드한다는 것은 첫 번째 컴파일에서 구조체가 정확하고 첫 번째 실행에서 올바른 디코드가 있다는 것을 의미하며, 중첩된 페이로드에서 정품 디버깅 세션을 저장합니다. 구조체가 다시 인코딩되어도 살아남기 위해 필요할 때 전원을 켭니다 omitempty 따라서 0 값은 출력에서 제외되고 태그는 다음과 같이 전달됩니다 json:"key,omitempty" 그 왕복 준비.
알만한 가치가 있는 한계는 무엇입니까?
정직한 가장자리 몇 개. 첫번째는 null. JSON null 자체적으로 유형 정보를 전달하지 않으므로 필드입니다 null 샘플에는 다음과 같이 입력됩니다 interface{}. 거기에는 도구가 추론할 수 있는 것이 아무것도 없습니다; 실제 유형을 알고 있는 경우 붙여넣기 후 편집기에서 변경하거나 해당 필드에 실제 값이 있는 샘플을 변환기에 공급하여 유형을 파생할 수 있습니다. 이는 도구의 단점이 아니라 데이터의 속성입니다.
두 번째는 숫자 정밀도이며,특히이 변환기가 아닌 일반적으로 JSON 구문 분석의 속성입니다. 도구는 browser's JSON 파서로 JSON 을 구문 분석합니다. 이는 숫자를 이중 정밀도 부동으로 나타내므로 대략 2 에서 53 번째 전력을 초과하는 정수는 구문 분석시 정확성을 잃습니다. 도구가보기 전에 생성 된 int64 필드는 충분히 넓습니다 붙잡다 큰 ID 이지만 ID 가 그렇게 큰 베어 JSON 번호로 도착하면 구문 분석은 이미 반올림되었습니다. 진정으로 큰 정수 ID 의 경우 강력한 이동은 JSON 에서 문자열로 전달하는 것입니다. 이를 통해 정확성을 유지하고 필드를 다음과 같이 입력할 수 있습니다 string.
세 번째는 추론이 복음이 아닌 출발점이라는 것입니다. 도구는 샘플이 지원하는 유형을 제공하지만 이 응답에서 정수인 필드가 실제로 무효 카운트라는 것을 여러분만이 알고 있습니다 float64 는 a가 되어야 한다 json.Number 정밀도 손실을 피하기 위하여. 당신이 세련하는 정확한 첫번째 초안으로 산출을,돌에서 새겨진 계약이 아닙니다 대우하십시오. 그것은 어떤 언어든지에 있는 모든 JSON 에 유형 발전기의 진실합니다.
마지막으로 변환기는 인라인 중첩 구조체를 생성하여 전체 모양을 하나의 선언으로 유지하여 블록으로 붙여넣을 수 있습니다. 이는 생성된 구조체에 대해 가장 일반적이고 읽기 쉬운 스타일이며 Go 생태계의 도구가 대중화한 것입니다. 깊이 재사용된 하위 개체에 대해 별도의 명명된 유형을 갖고 싶다면 인라인 버전이 편집기에 있으면 손으로 수행하는 리팩터이며 일반적으로 IDE를 사용하여 5초 동안 추출합니다.
자주 묻는 질문
JSON to Go 구조체 변환기란 무엇입니까? JSON to Go 구조체 변환기는 JSON 문서를 설명하는 Go 유형 선언으로 변환합니다. 각 객체는 구조체가 되고,각 필드는 json: & quot;key& quot; 태그를 얻고,값 유형이 추론되므로,구조체를 직접 작성하지 않고도 인코딩/json 으로 동일한 데이터를 언마샬링할 수 있습니다.
JSON 을 Go 구조체로 변환하려면 어떻게 해야 합니까? 입력 상자에 JSON 을 붙여넣고 루트 유형의 이름을 입력한 다음 정수 및 태그 옵션을 선택한 다음 변환을 클릭합니다. 이 도구는.go 파일에 바로 복사할 수 있는 json 태그가 포함된 Go 구조체 정의를 인쇄합니다.
Go 필드 이름이 JSON 키와 다른 이유는 무엇입니까? Go 는 내보낸 필드만 인코딩하므로 각 필드 이름은 대문자로 표시되고 일반적인 두문자어는 골린트와 일치하도록 대문자로 만들어집니다. json:"..." 모든 필드의 태그는 원래 키를 유지하므로 json.Unmarshal 은 이름이 변경된 필드에도 불구하고 여전히 데이터를 올바르게 매핑합니다.
JSON 번호는 Go 유형에 어떻게 매핑됩니까? 정수는 int 가 되고,그 옵션을 활성화하면 int64 가 되고,소수점이 있는 숫자는 float64 가 됩니다. 배열이 같은 위치에 대해 정수와 소수를 혼합하면,유형이 float64 로 넓어져서 모든 값이 맞습니다.
객체 배열은 어떻게 처리되나요? 객체의 배열은 어떤 요소가 가지고 있는 모든 키를 포함하는 단일 구조체로 병합됩니다. 두 요소가 동일한 키 호환되지 않는 유형을 제공하면 해당 필드는 interface{}가 되므로 구조체는 여전히 전체 배열을 덮습니다.
null 값은 어떻게 되나요? JSON null 은 자체적으로 타입 정보를 주지 않으므로 필드는 interface{}로 입력됩니다. 실제 타입을 알고 있다면 붙여넣기 후 편집기에서 변경하거나 JSON 에 null 이 아닌 예제 값을 제공하여 타입을 추론할 수 있습니다.
내 json이 아무데나 업로드됩니까? 아니요. 변환은 전적으로 기기에서 JavaScript 를 사용하여 브라우저에서 이루어집니다. JSON 은 업로드,로그 또는 저장되지 않으며,페이지가 로드되면 도구가 네트워크 연결이 끊긴 상태로 계속 작동합니다.
JSON to Go 구조체 변환기는 무료입니까? 예. 가입,워터마크, 사용량 상한선이 없는 완전 무료입니다. 개인 또는 상업 프로젝트에 필요한 만큼의 JSON 문서를 Go 구조체로 변환합니다.



