找回密码
 立即注册
查看: 254|回复: 0

解决protobuf忽略空返回值的问题

[复制链接]
发表于 2022-5-20 16:15 | 显示全部楼层 |阅读模式
最近在用Kratos开发项目的时候遇到了问题,repeated类型的字段在值为空的情况下,字段被直接忽略掉了。

我希望的是即使为空的情况下也能返回一个空数组,而不是直接把整个字段忽略掉,就像下面这样:
{    "code": 0,    "msg": "",    "result": {        "id": 2,        "memberCount": 13,        "name": "超级团队",        "admin": [            {                "id": 4,                "name": "Jason(Jason)"            },        ],        "clientCamp": []    }}
经过多方排查之后找到了问题所在,google会在生成pb.go文件时在json标签里插入omitempty属性,而json库在转换json时一旦遇到这个标签就会忽略掉空字段,这不符合我的需求,所以把这个字段去掉就好了。

先写一个shell脚本来递归遍历api目录下的pb.go文件:
#!/bin/bashfunction scandir() {    local cur_dir parent_dir workdir    workdir=$1    cd $workdir    if [ [$workdir = "/"] ]    then        cur_dir=""    else        cur_dir=$(pwd)    fi     for dirlist in $(ls $cur_dir)    do        if test -d $dirlist; then            cd $dirlist            scandir ${cur_dir}/${dirlist}            cd ..        elif [ "${dirlist#*.}"x = "pb.go"x ];then            echo ${cur_dir}/${dirlist}        fi    done}if test -d $1then    scandir $1elif test -f $1then    echo "you input a file but not a directory, pls reinput and try again"    exit 1else    echo "the Directory isn't exist which you input. pls input a new one"    exit1fi
接着修改Makefile文件:
.PHONY: api# generate api protoapi:    protoc --proto_path=./api \           --proto_path=./third_party \           --go_out=paths=source_relative:./api \           --go-http_out=paths=source_relative:./api \           --go-grpc_out=paths=source_relative:./api \           --openapi_out==paths=source_relative:. \           $(API_PROTO_FILES)    ./scandir.sh api | xargs -n1 -IX bash -c 'sed s/,omitempty// X > X.tmp'    ./scandir.sh api | xargs -n1 -IX bash -c 'mv X{.tmp,}'
在api的最下面添加替换脚本,流程就是遍历scandir脚本查出来的pb.go文件,替换掉文件里所有的omitempty,然后将文件暂存为.tmp,最后再覆盖原文件。

今后每次执行make api时就会连带自动替换掉所有生成文件中的omitempty,免得每次手动替换麻烦又容易出错。

参考:https://ld246.com/article/1591110788411
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-27 05:23 , Processed in 0.090932 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表