참고: 이 사이트는 지원 중단되었습니다. 이 사이트는 2023년 1월 31일 이후 지원이 중단되며 트래픽은 https://protobuf.dev에서 새 사이트로 리디렉션됩니다. 그때까지는 protobuf.dev로만 업데이트됩니다.

Package google.protobuf

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

색인

모두

Any에는 임의의 직렬화된 메시지와 직렬화된 메시지 유형을 설명하는 URL이 포함됩니다.

JSON

Any 값의 JSON 표현은 역직렬화된 삽입된 메시지의 정규 표현을 사용하며 URL에 유형 필드가 포함된 @type 필드를 추가합니다. 예:

package google.profile;
message Person {
  string first_name = 1;
  string last_name = 2;
}

{
  "@type": "type.googleapis.com/google.profile.Person",
  "firstName": <string>,
  "lastName": <string>
}

삽입된 메시지 유형이 잘 알려져 있으며 맞춤 JSON 표현이 있는 경우 @type 필드 외에 맞춤 JSON이 포함된 value 필드를 추가하여 해당 표현이 삽입됩니다. 예 (메시지 google.protobuf.Duration):

{
  "@type": "type.googleapis.com/google.protobuf.Duration",
  "value": "1.212s"
}
필드 이름 유형 설명
type_url string

직렬화된 메시지 유형을 설명하는 URL/리소스 이름입니다.

http, https 또는 스키마를 사용하지 않는 URL의 경우 다음과 같은 제한사항 및 해석이 적용됩니다.

  • 스키마가 제공되지 않으면 https로 간주됩니다.
  • URL 경로의 마지막 세그먼트는 해당 유형의 정규화된 이름을 나타내야 합니다 (예: path/google.protobuf.Duration).
  • URL의 HTTP GET은 바이너리 형식의 google.protobuf.Type 값을 생성하거나 오류를 생성해야 합니다.
  • 애플리케이션은 URL을 기준으로 조회 결과를 캐시하거나 조회를 방지하기 위해 바이너리로 미리 컴파일할 수 있습니다. 따라서 유형 변경에 관한 바이너리 호환성을 유지해야 합니다. 버전이 지정된 유형 이름을 사용하여 브레이킹 체인지를 관리합니다.

http, https (또는 빈 스키마) 이외의 스키마는 구현별 시맨틱스와 함께 사용할 수 있습니다.

value bytes 위에 지정된 유형의 유효한 직렬화된 데이터여야 합니다.

Api

API는 프로토콜 버퍼 서비스를 위한 경량 설명자입니다.

필드 이름 유형 설명
name string 이 API의 정규화된 이름으로 패키지 이름 뒤에 API의 간단한 이름을 포함합니다.
methods Method 이 API의 메서드를 지정되지 않은 순서로 표시합니다.
options Option API에 연결된 모든 메타데이터입니다.
version string

이 API의 버전 문자열입니다. 지정된 경우 1.10과 같이 major-version.minor-version 형식이어야 합니다. 부 버전을 생략하면 기본값은 0입니다. 전체 버전 필드가 비어 있으면 메이저 버전은 아래에 설명된 대로 패키지 이름에서 파생됩니다. 필드가 비어 있지 않으면 패키지 이름의 버전이 여기에 제공된 버전과 일치하는지 확인됩니다.

버전 관리 스키마는 메이저 버전 번호가 브레이킹 체인지를 나타내고 부 버전은 브레이킹 체인지되지 않는 변경을 나타내는 시맨틱 버전 관리를 사용합니다. 두 버전 번호 모두 사용자에게 다양한 버전을 기대할 수 있음을 알리는 신호로, 제품 요금제에 따라 신중하게 선택해야 합니다.

메이저 버전은 API의 패키지 이름에도 반영되며 google.feature.v1와 같이 v<major-version>로 끝나야 합니다. 메이저 버전 0과 1의 경우 접미사를 생략할 수 있습니다. 0개의 메이저 버전은 실험용 비GA API에만 사용해야 합니다.

source_context SourceContext 이 메시지로 표시되는 프로토콜 버퍼 서비스의 소스 컨텍스트입니다.
mixins Mixin 포함된 API Mixin 페이지를 참고하세요.
syntax Syntax 서비스의 소스 구문입니다.

BoolValue

bool의 래퍼 메시지입니다.

BoolValue의 JSON 표현은 JSON truefalse입니다.

필드 이름 유형 설명
value bool 부울 값입니다.

BytesValue

bytes의 래퍼 메시지입니다.

BytesValue의 JSON 표현은 JSON 문자열입니다.

필드 이름 유형 설명
value bytes 바이트 값입니다.

DoubleValue

double의 래퍼 메시지입니다.

DoubleValue의 JSON 표현은 JSON 숫자입니다.

필드 이름 유형 설명
value double double 값입니다.

시간

Duration은 나노초 해상도에서 초 및 초수로 표시되는 부호 있는 고정 길이 기간을 나타냅니다. '일' 또는 '월'과 같은 캘린더 및 개념과는 별개입니다. 두 타임스탬프 값의 차이가 지속 시간이며 타임스탬프에서 더하거나 뺄 수 있다는 점에서 타임스탬프와 관련이 있습니다. 범위는 약 +10,000년입니다.

예 1: 의사 코드의 두 타임스탬프에서 기간을 컴퓨팅합니다.

Timestamp start = ...;
Timestamp end = ...;
Duration duration = ...;

duration.seconds = end.seconds - start.seconds;
duration.nanos = end.nanos - start.nanos;

if (duration.seconds < 0 && duration.nanos > 0) {
  duration.seconds += 1;
  duration.nanos -= 1000000000;
} else if (duration.seconds > 0 && duration.nanos < 0) {
  duration.seconds -= 1;
  duration.nanos += 1000000000;
}

예 2: 의사 코드의 타임스탬프 + 기간에서 타임스탬프 계산

Timestamp start = ...;
Duration duration = ...;
Timestamp end = ...;

end.seconds = start.seconds + duration.seconds;
end.nanos = start.nanos + duration.nanos;

if (end.nanos < 0) {
  end.seconds -= 1;
  end.nanos += 1000000000;
} else if (end.nanos >= 1000000000) {
  end.seconds += 1;
  end.nanos -= 1000000000;
}

Duration의 JSON 표현은 String으로, s로 끝나고 초를 나타내며 초 단위의 앞에 나노초를 초 단위로 표시합니다.

필드 이름 유형 설명
seconds int64 부호 있는 시간(초)입니다. -315,576,000,000 이상 +315,576,000,000 이하여야 합니다.
nanos int32 시간 범위의 나노초 해상도에서 부호가 있는 초수입니다. 지속 시간은 1초 미만이고 seconds 필드는 0, 양수 또는 음수는 nanos 필드로 표시됩니다. 기간이 1초 이상인 경우 nanos 필드의 0이 아닌 값은 seconds 필드와 같은 기호여야 합니다. -999,999,999 ~ +999,999,999(포함) 사이여야 합니다.

비어 있음

API에서 중복된 빈 메시지를 정의하지 않도록 재사용하기 위한 일반 빈 메시지입니다. 일반적인 예는 API 메서드의 요청 또는 응답 유형으로 이를 사용하는 것입니다. 예:

service Foo {
  rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
}

Empty의 JSON 표현은 빈 JSON 객체 {}입니다.

열거형

열거형 유형 정의입니다.

필드 이름 유형 설명
name string Enum 유형 이름입니다.
enumvalue EnumValue 열거형 값 정의입니다.
options Option 프로토콜 버퍼 옵션.
source_context SourceContext 소스 컨텍스트입니다.
syntax Syntax 소스 구문입니다.

EnumValue

열거형 값 정의입니다.

필드 이름 유형 설명
name string 열거형 값 이름입니다.
number int32 Enum 값 번호입니다.
options Option 프로토콜 버퍼 옵션.

필드

메시지 유형의 단일 필드입니다.

필드 이름 유형 설명
kind Kind 필드 유형입니다.
cardinality Cardinality 필드 카디널리티입니다.
number int32 필드 번호입니다.
name string 필드 이름입니다.
type_url string 메시지 또는 열거형 유형의 스키마가 없는 필드 유형 URL입니다. 예: "type.googleapis.com/google.protobuf.Timestamp"
oneof_index int32 Type.oneofs 필드 유형 색인(메시지 또는 열거형 유형) 첫 번째 유형의 색인은 1입니다. 0은 유형이 목록에 없음을 의미합니다.
packed bool 대체 패킹 와이어 표현 사용 여부입니다.
options Option 프로토콜 버퍼 옵션입니다.
json_name string 필드 JSON 이름입니다.
default_value string 이 필드의 기본값 문자열입니다. Proto2 구문만 해당됩니다.

카디널리티

필드가 선택사항인지, 필수인지, 반복되는지 여부

enum 값 설명
CARDINALITY_UNKNOWN 카디널리티를 알 수 없는 필드에 사용합니다.
CARDINALITY_OPTIONAL 선택사항 입력란
CARDINALITY_REQUIRED 필수 필드 Proto2 구문만 해당됩니다.
CARDINALITY_REPEATED 반복 필드용입니다.

종류

기본 필드 유형입니다.

enum 값 설명
TYPE_UNKNOWN 알 수 없는 필드 유형입니다.
TYPE_DOUBLE 필드 유형이 double입니다.
TYPE_FLOAT 필드 유형 float
TYPE_INT64 필드 유형 int64.
TYPE_UINT64 필드 유형 uint64.
TYPE_INT32 필드 유형 int32.
TYPE_FIXED64 필드 유형이 고정되었습니다.
TYPE_FIXED32 필드 유형이 고정되었습니다.
TYPE_BOOL 필드 유형 부울입니다.
TYPE_STRING 필드 유형 문자열입니다.
TYPE_GROUP 필드 유형 그룹입니다. Proto2 구문만 지원되었으며 지원 중단되었습니다.
TYPE_MESSAGE 필드 유형 메시지입니다.
TYPE_BYTES 필드 유형 바이트입니다.
TYPE_UINT32 필드 유형 uint32
TYPE_ENUM 필드 유형 enum입니다.
TYPE_SFIXED32 필드 유형 sfixed32.
TYPE_SFIXED64 필드 유형 sfixed64.
TYPE_SINT32 필드 유형 sint32
TYPE_SINT64 필드 유형 sint64.

FieldMask

FieldMask는 기호화된 필드 경로 집합을 나타냅니다. 예를 들면 다음과 같습니다.

paths: "f.a"
paths: "f.b.d"

여기서 f 는 일부 루트 메시지의 필드, ab 메시지의 필드 f, d 메시지의 필드 f.b를 나타냅니다.

필드 마스크는 get 작업 (프로젝션)에서 반환하거나 업데이트 작업으로 수정해야 하는 필드의 하위 집합을 지정하는 데 사용됩니다. 필드 마스크에는 맞춤 JSON 인코딩도 있습니다 (아래 참고).

투영의 필드 마스크

FieldMask에서 프로젝션을 지정하면 API는 응답 메시지 (또는 하위 메시지)를 필터링하여 마스크에 지정된 필드만 포함합니다. 다음과 같은 '사전 마스킹' 응답 메시지를 예로 들어보겠습니다.

f {
  a : 22
  b {
    d : 1
    x : 2
  }
  y : 13
}
z: 8

이전 예에서 마스크를 적용한 후 API 응답은 필드 x, y 또는 z에 대한 특정 값을 포함하지 않습니다. 해당 값이 기본값으로 설정되고 proto 텍스트 출력에서는 생략됩니다.

f {
  a : 22
  b {
    d : 1
  }
}

필드 마스크의 마지막 위치를 제외하고 반복되는 필드는 허용되지 않습니다.

getOperation에 FieldMask 객체가 없으면 (모든 필드의 FieldMask가 지정된 것처럼) 작업이 모든 필드에 적용됩니다.

필드 마스크가 최상위 응답 메시지에 반드시 적용되는 것은 아닙니다. REST get 작업의 경우 필드 마스크가 응답에 직접 적용되지만 REST 목록 작업의 경우 마스크가 반환된 리소스 목록의 각 개별 메시지에 대신 적용됩니다. REST 커스텀 메서드의 경우 다른 정의를 사용할 수 있습니다. 마스크가 적용되는 경우 API에서 선언과 함께 명확하게 문서화됩니다. 어떤 경우든 반환된 리소스/리소스에 미치는 영향은 API에 필요한 동작입니다.

업데이트 작업의 필드 마스크

업데이트 작업의 필드 마스크는 대상 리소스에서 업데이트될 필드를 지정합니다. API는 마스크에 지정된 필드의 값만 변경하고 나머지는 변경하지 않은 상태로 두기만 하면 됩니다. 업데이트된 값을 설명하기 위해 리소스가 전달되는 경우 API는 마스크가 적용되지 않는 모든 필드의 값을 무시합니다.

필드 값을 기본값으로 재설정하려면 필드가 마스크에 있고 제공된 리소스에서 기본값으로 설정되어야 합니다. 따라서 리소스의 모든 필드를 재설정하려면 리소스의 기본 인스턴스를 제공하고 마스크의 모든 필드를 설정하거나 아래 설명된 대로 마스크를 제공하지 마세요.

업데이트 시 필드 마스크가 없으면 모든 필드의 필드 마스크가 지정된 것처럼 모든 필드에 작업이 적용됩니다. 스키마가 존재하는 경우 클라이언트가 알지 못하므로 요청에 입력하지 않은 필드는 기본값으로 재설정됩니다. 이것이 원치 않는 동작인 경우 특정 서비스에서 클라이언트에 항상 필드 마스크를 지정해야 할 경우 오류가 발생할 수 있습니다.

get 작업과 마찬가지로 요청 메시지에서 업데이트된 값을 설명하는 리소스의 위치는 작업 종류에 따라 다릅니다. 어떤 경우든 필드 마스크의 효과를 API에서 준수해야 합니다.

HTTP REST에 대한 고려사항

필드 마스크를 사용하는 HTTP 작업의 HTTP 작업은 HTTP 시맨틱스를 충족하려면 PUT 대신 PATCH로 설정되어야 합니다 (PUT은 전체 업데이트에만 사용해야 합니다).

필드 마스크의 JSON 인코딩

JSON에서 필드 마스크는 경로가 쉼표로 구분된 단일 문자열로 인코딩됩니다. 각 경로의 필드 이름은 하위 카멜 이름 지정 규칙으로 또는 이 필드에서 변환됩니다.

예를 들어 다음과 같은 메시지 선언을 고려해 보세요.

message Profile {
  User user = 1;
  Photo photo = 2;
}
message User {
  string display_name = 1;
  string address = 2;
}

proto에서 Profile의 필드 마스크는 다음과 같습니다.

mask {
  paths: "user.display_name"
  paths: "photo"
}

JSON에서 동일한 마스크는 아래와 같이 표시됩니다.

{
  mask: "user.displayName,photo"
}
필드 이름 유형 설명
paths string 필드 마스크 경로 집합입니다.

FloatValue

float의 래퍼 메시지입니다.

FloatValue의 JSON 표현은 JSON 숫자입니다.

필드 이름 유형 설명
value float 부동 소수점 값입니다.

Int32Value

int32의 래퍼 메시지입니다.

Int32Value의 JSON 표현은 JSON 숫자입니다.

필드 이름 유형 설명
value int32 int32 값입니다.

Int64Value

int64의 래퍼 메시지입니다.

Int64Value의 JSON 표현은 JSON 문자열입니다.

필드 이름 유형 설명
value int64 int64 값입니다.

ListValue

ListValue는 반복되는 값 필드를 둘러싼 래퍼입니다.

ListValue의 JSON 표현은 JSON 배열입니다.

필드 이름 유형 설명
values Value 동적으로 입력되는 값의 반복되는 입력란입니다.

메서드

method는 API의 메서드를 나타냅니다.

필드 이름 유형 설명
name string 이 메서드의 간단한 이름입니다.
request_type_url string 입력 메시지 유형의 URL입니다.
request_streaming bool true인 경우 요청이 스트리밍됩니다.
response_type_url string 출력 메시지 유형의 URL입니다.
response_streaming bool true인 경우 응답이 스트리밍됩니다.
options Option 메서드에 연결된 메타데이터입니다.
syntax Syntax 이 메서드의 소스 구문입니다.

Mixin

이 API에 포함될 API를 선언합니다. include API는 포함된 API의 모든 메서드를 다시 선언해야 하지만 문서와 옵션은 다음과 같이 상속됩니다.

  • 주석 및 공백 삭제 후 재선언된 메서드의 문서 문자열이 비어 있는 경우 기존 메서드에서 상속됩니다.

  • 재선언된 메서드에 설정되지 않은 서비스 구성 (http, 가시성)에 속하는 각 주석은 상속됩니다.

  • http 주석이 상속되면 경로 패턴은 다음과 같이 수정됩니다. 모든 버전 프리픽스가 포함 API 버전과 root 경로(지정된 경우)로 대체됩니다.

간단한 믹스인의 예:

package google.acl.v1;
service AccessControl {
  // Get the underlying ACL object.
  rpc GetAcl(GetAclRequest) returns (Acl) {
    option (google.api.http).get = "/v1/{resource=**}:getAcl";
  }
}

package google.storage.v2;
service Storage {
  //       rpc GetAcl(GetAclRequest) returns (Acl);

  // Get a data record.
  rpc GetData(GetDataRequest) returns (Data) {
    option (google.api.http).get = "/v2/{resource=**}";
  }
}

믹스인 구성의 예:

apis:
- name: google.storage.v2.Storage
  mixins:
  - name: google.acl.v1.AccessControl

믹스인 구성은 AccessControl의 모든 메서드도 Storage에서 동일한 이름과 요청/응답 유형으로 선언되었음을 암시합니다. 문서 생성기 또는 주석 프로세서는 다음과 같이 문서 및 주석을 인서트한 후 유효한 Storage.GetAcl 메서드를 확인합니다.

service Storage {
  // Get the underlying ACL object.
  rpc GetAcl(GetAclRequest) returns (Acl) {
    option (google.api.http).get = "/v2/{resource=**}:getAcl";
  }
  ...
}

경로 패턴의 버전이 v1에서 v2로 어떻게 변경되었는지 확인합니다.

믹스인의 root 필드가 지정된 경우 상속된 HTTP 경로가 배치되는 상대 경로여야 합니다. 예:

apis:
- name: google.storage.v2.Storage
  mixins:
  - name: google.acl.v1.AccessControl
    root: acls

이는 다음의 상속된 HTTP 주석을 의미합니다.

service Storage {
  // Get the underlying ACL object.
  rpc GetAcl(GetAclRequest) returns (Acl) {
    option (google.api.http).get = "/v2/acls/{resource=**}:getAcl";
  }
  ...
}
필드 이름 유형 설명
name string 포함된 API의 정규화된 이름입니다.
root string 비어 있지 않은 경우 상속된 HTTP 경로가 루팅된 경로를 지정합니다.

NullValue

NullValueValue 유형 통합의 null 값을 나타내는 싱글톤 열거형입니다.

NullValue의 JSON 표현은 JSON null입니다.

enum 값 설명
NULL_VALUE null 값입니다.

옵션

메시지, 필드, 열거형 등에 첨부할 수 있는 프로토콜 버퍼 옵션

필드 이름 유형 설명
name string 옵션의 이름입니다. 예를 들면 "java_package"입니다.
value Any 옵션의 값입니다. 예를 들면 "com.google.protobuf"입니다.

SourceContext

SourceContext는 요소가 정의된 파일과 같이 protobuf 요소의 소스 관련 정보를 나타냅니다.

필드 이름 유형 설명
file_name string 연결된 protobuf 요소가 포함된 .proto 파일의 정규화된 경로 이름입니다. 예: "google/protobuf/source.proto".

StringValue

string의 래퍼 메시지입니다.

StringValue의 JSON 표현은 JSON 문자열입니다.

필드 이름 유형 설명
value string 문자열 값입니다.

구조체

Struct는 동적으로 입력된 값에 매핑되는 필드로 구성된 구조화된 데이터 값을 나타냅니다. 일부 언어에서는 네이티브 표현으로 Struct를 지원할 수도 있습니다. 예를 들어 JS와 같은 스크립트 언어에서는 구조체가 객체로 표시됩니다. 이러한 표현에 대한 자세한 내용은 해당 언어의 proto 지원 기능과 함께 설명되어 있습니다.

Struct의 JSON 표현은 JSON 객체입니다.

필드 이름 유형 설명
fields map<string, Value> 동적으로 입력된 값의 맵입니다.

문법

프로토콜 버퍼 요소가 정의되는 구문입니다.

enum 값 설명
SYNTAX_PROTO2 구문 proto2.
SYNTAX_PROTO3 구문 proto3.

타임스탬프

타임스탬프는 시간대 또는 캘린더와는 무관하게 UTC 에포크 이후 나노초 단위의 초 및 초수로 표현되는 특정 시점을 나타냅니다. 이 값은 그레고리력을 1년 역산하는 역산 그레고리력을 사용하여 인코딩됩니다. 인코딩 시 모든 분의 길이가 60초라고 가정합니다. 즉, 윤초는 '스미어(smear)' 처리되므로 해석을 위한 별도의 윤초 테이블이 필요하지 않습니다. 범위는 0001-01-01T00:00:00Z~9999-12-31T23:59:59.999999999Z입니다. 이 범위로 제한하면 RFC 3339 날짜 문자열로 변환하거나 이 문자열에서 변환될 수 있습니다. https://www.ietf.org/rfc/rfc3339.txt를 참조하세요.

예 1: POSIX time()에서 타임스탬프 계산

Timestamp timestamp;
timestamp.set_seconds(time(NULL));
timestamp.set_nanos(0);

예 2: POSIX gettimeofday()에서 타임스탬프 계산

struct timeval tv;
gettimeofday(&tv, NULL);

Timestamp timestamp;
timestamp.set_seconds(tv.tv_sec);
timestamp.set_nanos(tv.tv_usec * 1000);

예 3: Win32 GetSystemTimeAsFileTime()에서 타임스탬프 계산

FILETIME ft;
GetSystemTimeAsFileTime(&ft);
UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;

// A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
// is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
Timestamp timestamp;
timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));

예 4: 자바 System.currentTimeMillis()에서 타임스탬프 계산

long millis = System.currentTimeMillis();

Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
    .setNanos((int) ((millis % 1000) * 1000000)).build();

예 5: Python의 현재 시간에서 에서 타임스탬프 계산

now = time.time()
seconds = int(now)
nanos = int((now - seconds) * 10**9)
timestamp = Timestamp(seconds=seconds, nanos=nanos)
필드 이름 유형 설명
seconds int64 Unix epoch 1970-01-01T00:00:00Z 이후 UTC 시간의 초 단위로 표현합니다. 0001-01-01T00:00:00:00~9999-12-31T23:59:59Z여야 합니다.
nanos int32 나노초 단위의 음수가 아닌 초수입니다. 음수의 초수 값에는 시간에 반영되는 음수가 아닌 나노초 값이 있어야 합니다. 범위는 0~999,999,999(포함)이어야 합니다.

유형

프로토콜 버퍼 메시지 유형입니다.

필드 이름 유형 설명
name string 정규화된 메시지 이름입니다.
fields Field 필드 목록입니다.
oneofs string 이 유형의 oneof 정의에 표시되는 유형의 목록입니다.
options Option 프로토콜 버퍼 옵션입니다.
source_context SourceContext 소스 컨텍스트입니다.
syntax Syntax 소스 구문입니다.

UInt32Value

uint32의 래퍼 메시지입니다.

UInt32Value의 JSON 표현은 JSON 숫자입니다.

필드 이름 유형 설명
value uint32 uint32 값입니다.

UInt64Value

uint64의 래퍼 메시지입니다.

UInt64Value의 JSON 표현은 JSON 문자열입니다.

필드 이름 유형 설명
value uint64 uint64 값입니다.

Value는 null, 숫자, 문자열, 불리언, 재귀 구조체 값 또는 값 목록일 수 있는 동적 유형 값을 나타냅니다. 값 제작자가 대안 중 하나를 설정해야 하며, 대안이 없으면 오류를 나타냅니다.

Value의 JSON 표현은 JSON 값입니다.

필드 이름 유형 설명
공용체 필드는 다음 중 하나에만 해당합니다.
null_value NullValue null 값을 나타냅니다.
number_value double double 값을 나타냅니다. NaN 또는 Infinity를 직렬화하려고 하면 오류가 발생합니다. 이러한 값은 일반 필드에서와 마찬가지로 number_value가 아닌 string_value로 파싱되므로 'NaN' 또는 'Infinity' 값으로 직렬화할 수 없습니다.
string_value string 문자열 값을 나타냅니다.
bool_value bool 부울 값을 나타냅니다.
struct_value Struct 구조화된 값을 나타냅니다.
list_value ListValue 반복되는 Value을 나타냅니다.