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>
}

埋め込みメッセージの型が well-known で、カスタム JSON 表現を持っている場合、その表現は @type フィールドに加えて、カスタム JSON を保持する value フィールドを追加して埋め込まれます。例(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 のバージョン文字列。指定されている場合、1.10 のように メジャーバージョン.マイナーバージョン の形式でなければなりません。マイナーバージョンが省略されている場合、デフォルトはゼロです。バージョンフィールド全体が空の場合、メジャーバージョンは以下に概説するようにパッケージ名から導出されます。フィールドが空でない場合、パッケージ名内のバージョンはここで提供されるものと一貫していることが検証されます。

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

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

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

BoolValue

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

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

フィールド名Type説明
valueboolブール値。

BytesValue

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

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

フィールド名Type説明
valuebytesバイト値。

DoubleValue

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

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

フィールド名Type説明
valuedouble倍精度浮動小数点数値。

Duration

Duration は、秒数とナノ秒分解能での秒の端数として表される、符号付きの固定長の時間スパンを表します。カレンダーや「日」や「月」のような概念とは独立しています。Timestamp とは、2つの Timestamp 値の差が Duration であり、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秒未満のDurationは、secondsフィールドが0で、nanosフィールドが正または負の値で表されます。1秒以上のDurationの場合、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

列挙型定義

フィールド名Type説明
namestring列挙型名。
enumvalueEnumValue列挙値定義。
optionsOptionプロトコルバッファオプション。
source_contextSourceContextソースコンテキスト。
syntaxSyntaxソース構文。
editionstringsyntaxSYNTAX_EDITIONS の場合のソースエディション。

EnumValue

列挙値の定義。

フィールド名Type説明
namestring列挙値名。
numberint32列挙値番号。
optionsOptionプロトコルバッファオプション。

Field

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

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

Cardinality

フィールドがオプション、必須、または繰り返しであるかどうか。

列挙値説明
CARDINALITY_UNKNOWNカーディナリティが不明なフィールドの場合。
CARDINALITY_OPTIONALオプションフィールドの場合。
CARDINALITY_REQUIRED必須フィールドの場合。Proto2 構文のみ。
CARDINALITY_REPEATED繰り返しフィールドの場合。

Kind

基本フィールド型。

列挙値説明
TYPE_UNKNOWNフィールド型が不明です。
TYPE_DOUBLEフィールド型 double。
TYPE_FLOATフィールド型 float。
TYPE_INT64フィールド型 int64。
TYPE_UINT64フィールド型 uint64。
TYPE_INT32フィールド型 int32。
TYPE_FIXED64フィールド型 fixed64。
TYPE_FIXED32フィールド型 fixed32。
TYPE_BOOLフィールド型 bool。
TYPE_STRINGフィールド型 string。
TYPE_GROUPフィールド型 group。Proto2 構文のみ、かつ非推奨。
TYPE_MESSAGEフィールド型 message。
TYPE_BYTESフィールド型 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 はルートメッセージ内のフィールドを表し、abf に見つかったメッセージ内のフィールド、df.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
  }
}

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

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

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

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

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

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

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

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

HTTP RESTに関する考慮事項

フィールドマスクを使用する更新操作の 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説明
valuefloat浮動小数点数値。

Int32Value

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

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

フィールド名Type説明
valueint3232ビット整数値。

Int64Value

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

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

フィールド名Type説明
valueint6464ビット整数値。

ListValue

ListValue は、値の繰り返しフィールドをラップしたものです。

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

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

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 型共用体のヌル値を表すためのシングルトン列挙です。

NullValue の JSON 表現は JSON null です。

列挙値説明
NULL_VALUEヌル値。

Option

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

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

SourceContext

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

フィールド名Type説明
file_namestring関連するプロトバッファ要素を含む .proto ファイルのパス付き修飾名。例: "google/protobuf/source.proto"

StringValue

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

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

フィールド名Type説明
valuestring文字列値。

Struct

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

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

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

Syntax

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

列挙値説明
SYNTAX_PROTO2構文 proto2
SYNTAX_PROTO3構文 proto3
SYNTAX_EDITIONS構文は edition 構造を使用します。

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説明
valueuint32符号なし 32 ビット整数値。

UInt64Value

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

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

フィールド名Type説明
valueuint64符号なし 64 ビット整数値。

Value

Value は、動的に型付けされた値を表します。これは、null、数値、文字列、ブール値、再帰的な構造体値、または値のリストのいずれかになります。値の生成元はこれらのバリアントのいずれかを設定することが期待され、いずれかのバリアントが存在しない場合はエラーを示します。

Value の JSON 表現は JSON 値です。

フィールド名Type説明
共用体フィールド。以下のいずれか 1 つのみ。
null_valueNullValueヌル値を表します。
number_valuedouble倍精度浮動小数点数を表します。NaN または Infinity のシリアル化を試みるとエラーになることに注意してください。(これらは通常のフィールドのように文字列「NaN」または「Infinity」としてシリアル化できません。なぜなら、それらは string_value として解析され、number_value として解析されないためです。)
string_valuestring文字列値を表します。
bool_valueboolブール値を表します。
struct_valueStruct構造化された値を表します。
list_valueListValue繰り返し Value を表します。