Protobuf3 JSON映射
proto 3支持JSON中的规范编码,使得系统之间更容易共享数据。下表按类型对编码进行了描述。
如果JSON编码的数据中缺少一个值,或者如果它的值为null,那么当解析到协议缓冲区时,它将被解释为合适的默认值。如果某个字段在协议缓冲区中具有默认值,则默认情况下,在JSON编码的数据中会省略该字段,以节省空间,可以提供选项来在 JSON-encoded的输出中发送具有默认值的字段。
proto3 | JSON | JSON实例 | 说明 |
---|---|---|---|
message | object | {"fooBar": v, "g": null, …} | 生成JSON对象。消息字段名映射到lowerCamelCase,成为JSON对象键。如果指定了JSON_name字段选项,则指定的值将被用作密钥。解析器接受lowerCamelCase名称(或JSON_name选项指定的名称)和原始的原域名称。null是所有字段类型的接受值,并被视为相应字段类型的默认值。 |
enum | string | "FOO_BAR" | 使用proto中指定的枚举值的名称。 |
map<K,V> | object | {"k": v, …} | 所有键都转换为字符串。 |
repeated V | array | [v, …] | null被接受为空列表[]。 |
bool | true, false | true, false | |
string | string | "Hello World!" | |
bytes | base64 string | "YWJjMTIzIT8kKiYoKSctPUB+" | JSON值使用标准base64编码和paddings编码作为字符串编码的数据。 |
int32, fixed32, uint32 | number | 1, -10, 0 | JSON值将是十进制数。接受数字或字符串。 |
int64, fixed64, uint64 | string | "1", "-10" | JSON值将是十进制数。接受数字或字符串。 |
float, double | number | 1.1, -10.0, 0, "NaN", "Infinity" | JSON值将是一个数字或特殊字符串值“NaN”、“Infinity”和“-Infinity”之一。接受数字或字符串。指数记数法也被接受。 |
Any | object | {"@type": "url", "f": v, … } | 如果Any包含具有特殊JSON映射的值,它将被转换如下: {“@ type”: XXX,“value”: yyy }。否则,该值将被转换成JSON对象,并且“@ type”字段将被插入以指示实际的数据类型。 |
Timestamp | string | "1972-01-01T10:00:20.021Z" | 使用RFC 3339,其中生成的输出总是Z归一化的,并使用0、3、6或9个小数位数。除“Z”之外的偏移也是可以接受的。 |
Duration | string | "1.000340012s", "1s" | 根据所需精度,生成的输出总是包含0、3、6或9个小数位数,后跟后缀“s”。接受任何小数位数(也没有),只要它们符合毫微秒精度,并且后缀“s”是必需的。 |
Struct | object | { … } | 任何JSON对象都可以。 |
Wrapper types | various types | 2, "2", "foo", true, "true", null, 0, … | 包装器在JSON中使用与包装基元类型相同的表示,只是在数据转换和传输期间允许并保留null。 |
FieldMask | string | "f.fooBar,h" | 请参见字段mask.proto |
ListValue | array | [foo, bar, …] | |
Value | value | ||
NullValue | null | JSON null |
JSON可选项
proto 3 JSON实现可能提供以下选项:
默认情况下,在proto 3 JSON输出中省略具有默认值的字段。实现可以提供一个选项来用默认值覆盖这个行为和输出字段。
忽略未知字段:默认情况下,proto3 JSON解析器拒绝未知字段,但可以通过指定在解析中忽略未知字段的选项。
使用proto域名而不是lowerCamelCase名称:默认情况下,proto 3 JSON会将域名转换为lowerCamelCase,并将其用作JSON名称。可以指定一个选项来使用proto字段名作为JSON名称。proto3 JSON解析器需要接受转换后的lowerCamelCase名称和proto字段名。
将枚举值作为整数而不是字符串发出:默认情况下,在JSON输出中使用枚举值的名称。可以提供一个选项来代替使用枚举值的数值。