PROTOBUF_TO_JSON

功能概述

把 Protobuf 二进制数据直接转换为 JSON 字符串,遵循 Protobuf 官方的 JSON 映射规则。适合把原始 Protobuf 消息转成可读文本做排查,或转存为 JSON 列供后续用 JSON 函数处理。转换不经过 STRUCT 中间结果,大批量转换时比

TO_JSON(FROM_PROTOBUF(...))
TO_JSON(FROM_PROTOBUF(...))
更快。

需要按字段过滤、聚合或展开数组时,用 FROM_PROTOBUF。

语法

PROTOBUF_TO_JSON(<data>, <message_name>, <descriptor> [, <options>])

参数说明

  • <data>
    <data>
    :BINARY 类型,Protobuf 编码的消息数据。为 NULL 时返回 NULL。
  • <message_name>
    <message_name>
    :STRING 常量,消息类型名,如
    'test.SimpleMsg'
    'test.SimpleMsg'
    。
  • <descriptor>
    <descriptor>
    :BINARY 常量,
    protoc --descriptor_set_out
    protoc --descriptor_set_out
    生成的
    FileDescriptorSet
    FileDescriptorSet
    ,生成方法见 Protobuf 函数。
  • <options>
    <options>
    :可选,
    MAP<STRING, STRING>
    MAP<STRING, STRING>
    常量,支持
    mode
    mode
    、
    emit.default.values
    emit.default.values
    、
    max.descriptor.bytes
    max.descriptor.bytes
    ,含义同 FROM_PROTOBUF。

返回 STRING 类型。输出格式遵循 Protobuf JSON 映射:

  • 字段名转为 lowerCamelCase,如
    created_at
    created_at
    输出为
    createdAt
    createdAt
  • bytes 输出为 Base64 字符串
  • enum 输出为枚举名
  • google.protobuf.Timestamp
    google.protobuf.Timestamp
    输出为 RFC 3339 时间字符串,
    google.protobuf.Duration
    google.protobuf.Duration
    输出为如
    "3661s"
    "3661s"
    的字符串
  • 未设置的字段不输出;空消息输出
    {}
    {}

使用示例

以下示例使用与 FROM_PROTOBUF 相同的

test.SimpleMsg
test.SimpleMsg
描述符:

SELECT protobuf_to_json( x'082a120568656c6c6f191f85eb51b81e094020012880d095ffbc3135000020403a03010203', 'test.SimpleMsg', x'0a89010a0a746573742e70726f746f120474657374226d0a0953696d706c654d7367120a0a026964180120012805120c0a046e616d65180220012809120d0a0573636f7265180320012801120e0a06616374697665180420012808120a0a027473180520012803120d0a05726174696f180620012802120c0a046461746118072001280c620670726f746f33' ) AS json_text;

{"id":42,"name":"hello","score":3.1400000000000001,"active":true,"ts":1700000000000,"ratio":2.5,"data":"AQID"}

data
data
字段的字节
01 02 03
01 02 03
输出为 Base64 字符串
AQID
AQID
。double 类型按完整精度输出,因此
3.14
3.14
显示为
3.1400000000000001
3.1400000000000001
。

空消息输出

{}
{}
:

SELECT protobuf_to_json( x'', 'test.SimpleMsg', x'0a89010a0a746573742e70726f746f120474657374226d0a0953696d706c654d7367120a0a026964180120012805120c0a046e616d65180220012809120d0a0573636f7265180320012801120e0a06616374697665180420012808120a0a027473180520012803120d0a05726174696f180620012802120c0a046461746118072001280c620670726f746f33' ) AS json_text;

{}

注意事项

  • 输出字段名为 lowerCamelCase。
  • 消息类型名和描述符必须是常量。

相关文档

联系我们
预约咨询
微信咨询
电话咨询
邮件咨询