Protocol Buffers Well-Known Types

google.protobuf パッケージの API ドキュメント。

インデックス

Value” で終わる Well-Known Types は、BoolValueEnumValue などの他の型のラッパーメッセージです。これらは現在では廃止されています。今日ラッパーを使用する唯一の理由は、

  • 既にそれらを使用しているメッセージとのワイヤー互換性。
  • スカラー値を Any メッセージに入れたい場合。

ほとんどの場合、より良い選択肢があります

  • 新しいメッセージの場合、通常の明示的な存在フィールド(proto2/proto3 では optional、エディション >= 2023 では通常のフィールド)を使用する方が良いでしょう。
  • 拡張機能は一般的に Any フィールドよりも良い選択肢です。

Any

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 表現を持つ場合、その表現はフィールド value を追加して埋め込まれ、@type フィールドに加えてカスタム JSON を保持します。例 (メッセージ google.protobuf.Duration の場合)

{
  "@type": "type.googleapis.com/google.protobuf.Duration",
  "value": "1.212s"
}
フィールド名Type説明
type_urlstring

シリアライズされたメッセージの型を記述するコンテンツを持つ URL/リソース名。

スキーマ httphttps、またはスキーマなしを使用する URL の場合、次の制限と解釈が適用されます

  • スキーマが提供されていない場合、https が想定されます。
  • URL のパスの最後のセグメントは、型の完全修飾名 (path/google.protobuf.Duration など) を表す必要があります。
  • URL に対する HTTP GET は、バイナリ形式の google.protobuf.Type 値を生成するか、エラーを生成する必要があります。
  • アプリケーションは、URL に基づいてルックアップ結果をキャッシュしたり、ルックアップを回避するためにバイナリにプリコンパイルしたりすることができます。したがって、型の変更時にバイナリ互換性を維持する必要があります。(破壊的な変更を管理するには、バージョン管理された型名を使用してください。)

httphttps (または空のスキーマ) 以外のスキーマは、実装固有のセマンティクスで使用される場合があります。

valuebytes上記の指定された型の有効なシリアライズされたデータである必要があります。

Api

Api は、プロトコルバッファサービスの軽量な記述子です。

フィールド名Type説明
namestringこの API の完全修飾名。パッケージ名と API の単純な名前が続きます。
methodsMethodこの API のメソッド。順序は指定されていません。
optionsOptionAPI に添付されたメタデータ。
versionstring

この API のバージョン文字列。指定する場合、major-version.minor-version の形式 (1.10 など) である必要があります。マイナーバージョンが省略されている場合、デフォルトはゼロになります。バージョンフィールド全体が空の場合、メジャーバージョンは後述するようにパッケージ名から派生します。フィールドが空でない場合、パッケージ名のバージョンはここで提供されるものと一致するように検証されます。

バージョニングスキーマは、セマンティックバージョニングを使用しており、メジャーバージョン番号は破壊的な変更を示し、マイナーバージョンは追加的で非破壊的な変更を示します。両方のバージョン番号は、さまざまなバージョンから何を期待すべきかをユーザーに伝えるシグナルであり、製品計画に基づいて慎重に選択する必要があります。

メジャーバージョンは、API のパッケージ名にも反映されており、google.feature.v1 のように、v<major-version> で終わる必要があります。メジャーバージョン 0 および 1 の場合、サフィックスは省略できます。ゼロメジャーバージョンは、実験的な非 GA API にのみ使用する必要があります。

source_contextSourceContextこのメッセージで表されるプロトコルバッファサービスのソースコンテキスト。
mixinsMixin含まれる API。Mixin を参照してください。
syntaxSyntaxサービスのソース構文。

BoolValue

bool のラッパーメッセージ。

BoolValue の JSON 表現は JSON true および false です。

フィールド名Type説明
valueboolbool 値。

BytesValue

bytes のラッパーメッセージ。

BytesValue の JSON 表現は JSON 文字列です。

フィールド名Type説明
valuebytesbytes 値。

DoubleValue

double のラッパーメッセージ。

DoubleValue の JSON 表現は JSON 数値です。

フィールド名Type説明
valuedoubledouble 値。

Duration

Duration は、秒数とナノ秒分解能での秒の小数部として表される、符号付きの固定長の期間を表します。これは、カレンダーや「日」や「月」のような概念とは独立しています。2 つの Timestamp 値の差が Duration であり、Timestamp に加算または減算できるという点で、Timestamp に関連しています。範囲は約 +-10,000 年です。

例 1: 擬似コードで 2 つの Timestamp から Duration を計算します。

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 + Duration から Timestamp を計算します。

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 表現は、秒を示すために s で終わり、秒数、および秒の小数部として表現されたナノ秒が先行する String です。

フィールド名Type説明
secondsint64期間の符号付き秒数。-315,576,000,000 から +315,576,000,000 までの範囲である必要があります。
nanosint32期間のナノ秒分解能での秒の符号付き小数部。1 秒未満の期間は、0 seconds フィールドと正または負の nanos フィールドで表されます。1 秒以上の期間の場合、nanos フィールドのゼロ以外の値は、seconds フィールドと同じ符号である必要があります。-999,999,999 から +999,999,999 までの範囲である必要があります。

Empty

API で重複した空のメッセージを定義することを避けるために再利用できる汎用的な空のメッセージ。一般的な例は、API メソッドのリクエストまたはレスポンスタイプとして使用することです。例えば

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

Empty の JSON 表現は空の JSON オブジェクト {} です。

Enum

Enum 型定義

フィールド名Type説明
namestringEnum 型名。
enumvalueEnumValueEnum 値の定義。
optionsOptionProtocol buffer オプション。
source_contextSourceContextソースコンテキスト。
syntaxSyntaxソース構文。

EnumValue

Enum 値の定義。

フィールド名Type説明
namestringEnum 値名。
numberint32Enum 値番号。
optionsOptionProtocol buffer オプション。

Field

メッセージ型の単一フィールド。

フィールド名Type説明
kindKindフィールド型。
cardinalityCardinalityフィールドのカーディナリティ。
numberint32フィールド番号。
namestringフィールド名。
type_urlstringメッセージまたは列挙型の場合の、スキームなしのフィールド型 URL。例: "type.googleapis.com/google.protobuf.Timestamp"
oneof_indexint32メッセージまたは列挙型の場合の、Type.oneofs 内のフィールド型のインデックス。最初の型はインデックス 1 を持ちます。ゼロは型がリストにないことを意味します。
packedbool代替のパックされたワイヤー表現を使用するかどうか。
optionsOptionプロトコルバッファオプション。
json_namestringフィールド JSON 名。
default_valuestringこのフィールドのデフォルト値の文字列値。Proto2 構文のみ。

Cardinality

フィールドが optional、required、または repeated であるかどうか。

Enum 値説明
CARDINALITY_UNKNOWNカーディナリティが不明なフィールドの場合。
CARDINALITY_OPTIONALoptional フィールドの場合。
CARDINALITY_REQUIREDrequired フィールドの場合。Proto2 構文のみ。
CARDINALITY_REPEATEDrepeated フィールドの場合。

Kind

基本的なフィールド型。

Enum 値説明
TYPE_UNKNOWN不明なフィールド型。
TYPE_DOUBLEdouble フィールド型。
TYPE_FLOATfloat フィールド型。
TYPE_INT64int64 フィールド型。
TYPE_UINT64uint64 フィールド型。
TYPE_INT32int32 フィールド型。
TYPE_FIXED64fixed64 フィールド型。
TYPE_FIXED32fixed32 フィールド型。
TYPE_BOOLbool フィールド型。
TYPE_STRINGstring フィールド型。
TYPE_GROUPgroup フィールド型。Proto2 構文のみで、非推奨。
TYPE_MESSAGEmessage フィールド型。
TYPE_BYTESbytes フィールド型。
TYPE_UINT32uint32 フィールド型。
TYPE_ENUMenum フィールド型。
TYPE_SFIXED32sfixed32 フィールド型。
TYPE_SFIXED64sfixed64 フィールド型。
TYPE_SINT32sint32 フィールド型。
TYPE_SINT64sint64 フィールド型。

FieldMask

FieldMask は、シンボリックフィールドパスのセットを表します。例:

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

ここで、f はルートメッセージのフィールド、abf に見られるメッセージのフィールド、df.b のメッセージに見られるフィールドを表します。

フィールドマスクは、get 操作 (projection) によって返されるフィールドのサブセット、または update 操作によって変更されるフィールドを指定するために使用されます。フィールドマスクには、カスタム JSON エンコーディングもあります (下記参照)。

プロジェクションにおけるフィールドマスク

FieldMaskprojection を指定する場合、API は応答メッセージ (またはサブメッセージ) をフィルタリングして、マスクで指定されたフィールドのみを含むようにします。たとえば、次の「マスク前」応答メッセージを考えてみましょう

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

前の例のマスクを適用すると、API 応答にはフィールド x、y、または z の特定の値は含まれません (それらの値はデフォルトに設定され、proto テキスト出力では省略されます)

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

repeated フィールドは、フィールドマスクの最後の位置を除いて許可されていません。

get 操作で FieldMask オブジェクトが存在しない場合、操作はすべてのフィールドに適用されます (すべてのフィールドの FieldMask が指定されたかのように)。

フィールドマスクは、必ずしもトップレベルの応答メッセージに適用されるわけではないことに注意してください。REST get 操作の場合、フィールドマスクは応答に直接適用されますが、REST list 操作の場合、マスクは代わりに返されたリソースリスト内の個々のメッセージに適用されます。REST カスタムメソッドの場合、他の定義が使用される場合があります。マスクが適用される場所は、API での宣言とともに明確に文書化されます。いずれにせよ、返されたリソース/リソースへの影響は、API の必須動作です。

Update 操作におけるフィールドマスク

update 操作のフィールドマスクは、ターゲットリソースのどのフィールドが更新されるかを指定します。API は、マスクで指定されたフィールドの値のみを変更し、他のフィールドは変更しないことが要求されます。更新された値を記述するためにリソースが渡される場合、API はマスクでカバーされていないすべてのフィールドの値を無視します。

フィールドの値をデフォルトにリセットするには、フィールドがマスクに含まれており、提供されたリソースでデフォルト値に設定されている必要があります。したがって、リソースのすべてのフィールドをリセットするには、リソースのデフォルトインスタンスを提供し、マスク内のすべてのフィールドを設定するか、以下で説明するようにマスクを提供しないでください。

フィールドマスクが update に存在しない場合、操作はすべてのフィールドに適用されます (すべてのフィールドのフィールドマスクが指定されたかのように)。スキーマの進化が存在する場合、これはクライアントが知らないフィールドであり、したがってリクエストに入力されていないフィールドがデフォルトにリセットされる可能性があることを意味する場合があります。これが望ましくない動作である場合、特定のサービスでは、クライアントが常にフィールドマスクを指定し、指定しない場合はエラーを生成することを要求する場合があります。

get 操作と同様に、リクエストメッセージで更新された値を記述するリソースの場所は、操作の種類によって異なります。いずれにせよ、フィールドマスクの効果は API によって尊重される必要があります。

HTTP REST の考慮事項

フィールドマスクを使用する update 操作の 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"
}
フィールド名Type説明
pathsstringフィールドマスクパスのセット。

FloatValue

float のラッパーメッセージ。

FloatValue の JSON 表現は JSON 数値です。

フィールド名Type説明
valuefloatfloat 値。

Int32Value

int32 のラッパーメッセージ。

Int32Value の JSON 表現は JSON 数値です。

フィールド名Type説明
valueint32int32 値。

Int64Value

int64 のラッパーメッセージ。

Int64Value の JSON 表現は JSON 文字列です。

フィールド名Type説明
valueint64int64 値。

ListValue

ListValue は、値の repeated フィールドのラッパーです。

ListValue の JSON 表現は JSON 配列です。

フィールド名Type説明
valuesValue動的に型付けされた値の repeated フィールド。

Method

Method は、API のメソッドを表します。

フィールド名Type説明
namestringこのメソッドの単純名。
request_type_urlstring入力メッセージタイプの URL。
request_streamingbooltrue の場合、リクエストはストリーミングされます。
response_type_urlstring出力メッセージタイプの URL。
response_streamingbooltrue の場合、レスポンスはストリーミングされます。
optionsOptionメソッドに添付されたメタデータ。
syntaxSyntaxこのメソッドのソース構文。

Mixin

この API に含まれる API を宣言します。含める API は、含まれる API からすべてのメソッドを再宣言する必要がありますが、ドキュメントとオプションは次のように継承されます

  • コメントと空白の削除後、再宣言されたメソッドのドキュメント文字列が空の場合、元のメソッドから継承されます。

  • 再宣言されたメソッドで設定されていないサービス構成 (http、visibility) に属する各アノテーションは継承されます。

  • http アノテーションが継承される場合、パスパターンは次のように変更されます。バージョンプレフィックスは、含める API のバージョンと、指定されている場合は root パスに置き換えられます。

単純な mixin の例

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=**}";
  }
}

mixin 構成の例

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

mixin 構造は、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 に変更された方法に注意してください。

mixin の 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";
  }
  ...
}
フィールド名Type説明
namestring含まれている API の完全修飾名。
rootstring空でない場合、継承された HTTP パスがルート化されるパスを指定します。

NullValue

NullValue は、Value 型ユニオンの null 値を表すシングルトン列挙型です。

NullValue の JSON 表現は JSON null です。

Enum 値説明
NULL_VALUENull 値。

Option

メッセージ、フィールド、列挙型などに添付できるプロトコルバッファオプション。

フィールド名Type説明
namestringオプションの名前。例: "java_package"
valueAnyオプションの値。例: "com.google.protobuf"

SourceContext

SourceContext は、protobuf 要素のソースに関する情報 (定義されているファイルなど) を表します。

フィールド名Type説明
file_namestring関連付けられた protobuf 要素を含む .proto ファイルのパス修飾名。例: "google/protobuf/source.proto"

StringValue

string のラッパーメッセージ。

StringValue の JSON 表現は JSON 文字列です。

フィールド名Type説明
valuestringstring 値。

Struct

Struct は、動的に型付けされた値にマップされるフィールドで構成される構造化データ値を表します。一部の言語では、Struct はネイティブ表現でサポートされている場合があります。たとえば、JS のようなスクリプト言語では、struct はオブジェクトとして表されます。その表現の詳細は、言語の proto サポートとともに説明されています。

Struct の JSON 表現は JSON オブジェクトです。

フィールド名Type説明
fieldsmap<string, Value>動的に型付けされた値のマップ。

Syntax

プロトコルバッファ要素が定義されている構文。

Enum 値説明
SYNTAX_PROTO2構文 proto2
SYNTAX_PROTO3構文 proto3

Timestamp

Timestamp は、タイムゾーンやカレンダーに依存しない時点を表し、UTC エポック時間での秒数とナノ秒分解能での秒の小数部として表されます。これは、グレゴリオ暦を 1 年まで遡って拡張するプロレプティックグレゴリオ暦を使用してエンコードされます。すべての分は 60 秒の長さであると想定してエンコードされます。つまり、うるう秒は「スメア」されるため、解釈にうるう秒テーブルは必要ありません。範囲は 0001-01-01T00:00:00Z から 9999-12-31T23:59:59.999999999Z までです。その範囲に制限することで、RFC 3339 日付文字列との間で変換できることを保証します。https://www.ietf.org/rfc/rfc3339.txt を参照してください。

Timestamp 型は、RFC 3339 形式の文字列としてエンコードされます: “{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z”。ここで、{year} は常に 4 桁で表され、{month}{day}{hour}{min}、および {sec} はそれぞれ 2 桁にゼロパディングされます。最大 9 桁 (つまり、最大 1 ナノ秒分解能) まで可能な秒の小数部はオプションです。“Z” サフィックスはタイムゾーン (“UTC”) を示します。タイムゾーンは必須です。proto3 JSON シリアライザーは、Timestamp 型を印刷するときは常に UTC (“Z” で示される) を使用する必要があり、proto3 JSON パーサーは UTC と他のタイムゾーン (オフセットで示される) の両方を受け入れることができる必要があります。

例 1: POSIX time() から Timestamp を計算します。

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

例 2: POSIX gettimeofday() から Timestamp を計算します。

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

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

例 3: Win32 GetSystemTimeAsFileTime() から Timestamp を計算します。

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: Java System.currentTimeMillis() から Timestamp を計算します。

long millis = System.currentTimeMillis();

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

例 5: Python の現在時刻から Timestamp を計算します。

now = time.time()
seconds = int(now)
nanos = int((now - seconds) * 10**9)
timestamp = Timestamp(seconds=seconds, nanos=nanos)
フィールド名Type説明
secondsint64Unix エポック 1970-01-01T00:00:00Z からの UTC 時間の秒数を表します。0001-01-01T00:00:00Z から 9999-12-31T23:59:59Z までの範囲である必要があります。
nanosint32ナノ秒分解能での秒の非負の小数部。小数部を持つ負の秒値は、時間的に前方にカウントする非負のナノ秒値を持つ必要があります。0 から 999,999,999 までの範囲である必要があります。

Type

プロトコルバッファメッセージ型。

フィールド名Type説明
namestring完全修飾メッセージ名。
fieldsFieldフィールドのリスト。
oneofsstringこの型の oneof 定義に現れる型のリスト。
optionsOptionプロトコルバッファオプション。
source_contextSourceContextソースコンテキスト。
syntaxSyntaxソース構文。

UInt32Value

uint32 のラッパーメッセージ。

UInt32Value の JSON 表現は JSON 数値です。

フィールド名Type説明
valueuint32uint32 値。

UInt64Value

uint64 のラッパーメッセージ。

UInt64Value の JSON 表現は JSON 文字列です。

フィールド名Type説明
valueuint64uint64 値。

Value

Value は、null、数値、文字列、ブール値、再帰的な struct 値、または値のリストのいずれかである動的に型付けされた値を表します。値のプロデューサーは、それらのバリアントの 1 つを設定することが期待されており、バリアントがない場合はエラーを示します。

Value の JSON 表現は JSON 値です。

フィールド名Type説明
ユニオンフィールド。次のいずれか 1 つのみ
null_valueNullValuenull 値を表します。
number_valuedoubledouble 値を表します。NaN または Infinity をシリアライズしようとするとエラーになることに注意してください。(通常のフィールドのように、これらを文字列 "NaN" または "Infinity" 値としてシリアライズすることはできません。文字列値として解析されるため、数値として解析されません)。
string_valuestring文字列値を表します。
bool_valueboolブール値を表します。
struct_valueStruct構造化された値を表します。
list_valueListValuerepeated Value を表します。