You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Protobuf的JsonFormat转JSON字符串时如何保留反斜杠?

解决gRPC Protobuf JsonFormat转JSON后bytes字段Base64解码问题

你的hash字段在Proto定义中应该是bytes类型,Protobuf的JsonFormat规范默认会将bytes类型序列化为Base64编码的字符串,这就是你看到转换结果的原因。要恢复原始的二进制转义格式,只需对Base64字符串做反向解码,再转成对应的转义字符串即可。

具体实现示例

Java 示例

import java.util.Base64;

public class HashDecoder {
    public static void main(String[] args) {
        // JsonFormat输出的Base64字符串
        String base64Hash = "dg5/6Id5lXdN3V0xKFq2xf4XyF920Q5RC9oYw14afP0=";
        // 解码成原始字节数组
        byte[] originalBytes = Base64.getDecoder().decode(base64Hash);
        
        // 生成与原始格式一致的八进制转义字符串
        StringBuilder escapedStr = new StringBuilder();
        for (byte b : originalBytes) {
            int value = b & 0xFF;
            if (value < 32 || value > 126) {
                escapedStr.append(String.format("\\%03o", value));
            } else {
                escapedStr.append((char) value);
            }
        }
        
        System.out.println(escapedStr.toString());
        // 输出结果:v\016\177\350\207y\225wM\335]1(Z\266\305\376\027\310_v\321\016Q\v\332\030\303^\032|\375
    }
}

Python 示例

import base64

base64_hash = "dg5/6Id5lXdN3V0xKFq2xf4XyF920Q5RC9oYw14afP0="
# 解码原始字节
original_bytes = base64.b64decode(base64_hash)

# 生成八进制转义字符串
escaped_str = ""
for b in original_bytes:
    if 32 <= b <= 126:
        escaped_str += chr(b)
    else:
        # 转成3位的八进制转义格式
        escaped_str += f"\\{oct(b)[2:].zfill(3)}"

print(escaped_str)
# 输出结果:v\016\177\350\207y\225wM\335]1(Z\266\305\376\027\310_v\321\016Q\v\332\030\303^\032|\375

额外说明

如果希望在JsonFormat序列化时直接输出原始转义格式而非Base64,需要自定义序列化逻辑——因为Protobuf官方的JsonFormat严格遵循规范,bytes类型默认就是Base64编码。相比自定义序列化,直接对Base64结果解码是更简单可靠的方案。

内容的提问来源于stack exchange,提问作者PaperFrog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:25:37